skip block when only class is passed to ability check, also don't pass class to block for :all - closes #116
This commit is contained in:
		
							parent
							
								
									04b523eea4
								
							
						
					
					
						commit
						6105edc6a7
					
				| @ -25,7 +25,7 @@ module CanCan | |||||||
| 
 | 
 | ||||||
|     # Matches the block or conditions hash |     # Matches the block or conditions hash | ||||||
|     def matches_conditions?(action, subject, extra_args) |     def matches_conditions?(action, subject, extra_args) | ||||||
|       if @block |       if @block && subject.class != Class | ||||||
|         call_block(action, subject, extra_args) |         call_block(action, subject, extra_args) | ||||||
|       elsif @conditions.kind_of?(Hash) && subject.class != Class |       elsif @conditions.kind_of?(Hash) && subject.class != Class | ||||||
|         matches_conditions_hash?(subject) |         matches_conditions_hash?(subject) | ||||||
| @ -95,7 +95,6 @@ module CanCan | |||||||
|     def call_block(action, subject, extra_args) |     def call_block(action, subject, extra_args) | ||||||
|       block_args = [] |       block_args = [] | ||||||
|       block_args << action if @expanded_actions.include?(:manage) |       block_args << action if @expanded_actions.include?(:manage) | ||||||
|       block_args << (subject.class == Class ? subject : subject.class) if @subjects.include?(:all) |  | ||||||
|       block_args << (subject.class == Class ? nil : subject) |       block_args << (subject.class == Class ? nil : subject) | ||||||
|       block_args += extra_args |       block_args += extra_args | ||||||
|       @block.call(*block_args) |       @block.call(*block_args) | ||||||
|  | |||||||
| @ -38,9 +38,8 @@ describe CanCan::Ability do | |||||||
|     @ability.can?(:read, 6).should be_false |     @ability.can?(:read, 6).should be_false | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   it "should pass class with object if :all objects are accepted" do |   it "should not pass class with object if :all objects are accepted" do | ||||||
|     @ability.can :preview, :all do |object_class, object| |     @ability.can :preview, :all do |object| | ||||||
|       object_class.should == Fixnum |  | ||||||
|       object.should == 123 |       object.should == 123 | ||||||
|       @block_called = true |       @block_called = true | ||||||
|     end |     end | ||||||
| @ -48,14 +47,13 @@ describe CanCan::Ability do | |||||||
|     @block_called.should be_true |     @block_called.should be_true | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   it "should pass class with no object if :all objects are accepted and class is passed directly" do |   it "should not call block when only class is passed, only return true" do | ||||||
|     @ability.can :preview, :all do |object_class, object| |     @block_called = false | ||||||
|       object_class.should == Hash |     @ability.can :preview, :all do |object| | ||||||
|       object.should be_nil |  | ||||||
|       @block_called = true |       @block_called = true | ||||||
|     end |     end | ||||||
|     @ability.can?(:preview, Hash) |     @ability.can?(:preview, Hash).should be_true | ||||||
|     @block_called.should be_true |     @block_called.should be_false | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   it "should pass action and object for global manage actions" do |   it "should pass action and object for global manage actions" do | ||||||
| @ -83,9 +81,8 @@ describe CanCan::Ability do | |||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   it "should return block result for action, object_class, and object for any action" do |   it "should return block result for action, object_class, and object for any action" do | ||||||
|     @ability.can :manage, :all do |action, object_class, object| |     @ability.can :manage, :all do |action, object| | ||||||
|       action.should == :foo |       action.should == :foo | ||||||
|       object_class.should == Fixnum |  | ||||||
|       object.should == 123 |       object.should == 123 | ||||||
|       @block_called = true |       @block_called = true | ||||||
|     end |     end | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Ryan Bates
						Ryan Bates