Has anyone had success having Rails 3, Mongoid and Inherited Resources working? Any tips for making it happen? I would love to use both gems.

Currently I am running into:

undefined method `scoped'

On index actions.

Thanks!


BTW a workaround for the scoped issue is to override collection like so:

class CampaignsController < InheritedResources::Base

  def collection
    @campaigns ||= end_of_association_chain.paginate(:page => params[:page])
  end

end

But I am looking for a more holistic approach

有帮助吗?

解决方案

If you are using only mongoid, what you should do is to overwrite the default collection behavior in Inherited Resources. The default behavior is this:

https://github.com/josevalim/inherited_resources/blob/master/lib/inherited_resources/base_helpers.rb#L22-24

That said, the following should do the trick:

module MongoidActions
  def collection
    get_collection_ivar || set_collection_ivar(end_of_association_chain.all)
  end
end

InheritedResources::Base.send :include, MongoidActions

You can even default the collection to paginate and have pagination for free in all pages.

其他提示

Alternatively you can patch Mongoid:

module MongoidScoped
  def scoped
    all
  end
end

Mongoid::Finders.send :include, MongoidScoped

This will make inherit_resources method work as expected.

Here's what I did to cover both inheriting from InheritedResources::Base and using inherit_resources statement.

module InheritedResources
  module BaseHelpers
    def collection
      get_collection_ivar || set_collection_ivar(end_of_association_chain.all)
    end
  end
end

You typically put this into an initializer (I use config/initializers/mongoid.rb).

Makes Mongoid 2.0.0.beta.20 and inherited_resources 1.2.1 friendly.

Very helpful post !

How would you do this if your controller cannot be subclassed from InheritedResource::Base but rather you have to use the class method inherit_resources, like so :

class MyController < AlreadyInheritedFromController
   inherit_resources
end

the above monkey patch does not seem to work in this setup.

It looks like the key might be InheritedResources::Base.inherit_resources but i am unclear on the correct way to overwrite this method. Please correct if i am on the wrong path here.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top