Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

load parent resources for collection actions such 'index'

  • Loading branch information...
commit 1ade44221a5e54b7c561499b89794150827dd5d6 1 parent 2a3dd85
@ryanb authored
View
2  CHANGELOG.rdoc
@@ -1,3 +1,5 @@
+* Load nested parent resources on collection actions such as "index" (thanks dohzya)
+
* Adding :name option to load_and_authorize_resource if it does not match controller - see issue #65
* Fixing issue when using accessible_by with nil can conditions (thanks jrallison) - see issue #66
View
4 lib/cancan/resource_authorization.rb
@@ -20,7 +20,9 @@ def load_and_authorize_resource
end
def load_resource
- unless collection_actions.include? @params[:action].to_sym
+ if collection_actions.include? @params[:action].to_sym
+ parent_resource
+ else
if new_actions.include? @params[:action].to_sym
resource.build(@params[model_name.to_sym])
elsif @params[:id]
View
13 spec/cancan/resource_authorization_spec.rb
@@ -86,12 +86,23 @@
end
it "should load nested resource and fetch other resource through the association" do
- stub(Person).find(456).stub!.abilities.stub!.find(123) { :some_ability }
+ person = Object.new
+ stub(Person).find(456) { person }
+ stub(person).abilities.stub!.find(123) { :some_ability }
authorization = CanCan::ResourceAuthorization.new(@controller, {:controller => "abilities", :action => "show", :id => 123, :person_id => 456}, {:nested => :person})
authorization.load_resource
+ @controller.instance_variable_get(:@person).should == person
@controller.instance_variable_get(:@ability).should == :some_ability
end
+ it "should load nested resource for collection action" do
+ person = Object.new
+ stub(Person).find(456) { person }
+ authorization = CanCan::ResourceAuthorization.new(@controller, {:controller => "abilities", :action => "index", :person_id => 456}, {:nested => :person})
+ authorization.load_resource
+ @controller.instance_variable_get(:@person).should == person
+ end
+
it "should load nested resource and build resource through a deep association" do
stub(Person).find(456).stub!.behaviors.stub!.find(789).stub!.abilities.stub!.build(nil) { :some_ability }
authorization = CanCan::ResourceAuthorization.new(@controller, {:controller => "abilities", :action => "new", :person_id => 456, :behavior_id => 789}, {:nested => [:person, :behavior]})

2 comments on commit 1ade442

@jondkinney

How do you use this?

@ryanb
Owner

Let's say you have Project has_many tasks, and the Task resource is nested under Project. This commit means the TasksController#index action will load the current project into the @project instance variable. This already happened for the other actions, this just applies it to the index action.

Please sign in to comment.
Something went wrong with that request. Please try again.