Fix rule check on Hash-like subjects
This commit is contained in:
		
							parent
							
								
									b2028c8aa7
								
							
						
					
					
						commit
						f23bbe04ef
					
				@ -21,7 +21,7 @@ module CanCan
 | 
			
		||||
 | 
			
		||||
    # Matches both the subject and action, not necessarily the conditions
 | 
			
		||||
    def relevant?(action, subject)
 | 
			
		||||
      subject = subject.values.first if subject.kind_of? Hash
 | 
			
		||||
      subject = subject.values.first if subject.class == Hash
 | 
			
		||||
      @match_all || (matches_action?(action) && matches_subject?(subject))
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
@ -31,7 +31,7 @@ module CanCan
 | 
			
		||||
        call_block_with_all(action, subject, extra_args)
 | 
			
		||||
      elsif @block && !subject_class?(subject)
 | 
			
		||||
        @block.call(subject, *extra_args)
 | 
			
		||||
      elsif @conditions.kind_of?(Hash) && subject.kind_of?(Hash)
 | 
			
		||||
      elsif @conditions.kind_of?(Hash) && subject.class == Hash
 | 
			
		||||
        nested_subject_matches_conditions?(subject)
 | 
			
		||||
      elsif @conditions.kind_of?(Hash) && !subject_class?(subject)
 | 
			
		||||
        matches_conditions_hash?(subject)
 | 
			
		||||
 | 
			
		||||
@ -291,6 +291,12 @@ describe CanCan::Ability do
 | 
			
		||||
    @ability.can?(:read, 123 => Range).should be_true
 | 
			
		||||
  end
 | 
			
		||||
  
 | 
			
		||||
  it "should allow to check ability on Hash-like object" do
 | 
			
		||||
    class Container < Hash; end
 | 
			
		||||
    @ability.can :read, Container
 | 
			
		||||
    @ability.can?(:read, Container.new).should be_true
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  it "should have initial attributes based on hash conditions of 'new' action" do
 | 
			
		||||
    @ability.can :manage, Range, :foo => "foo", :hash => {:skip => "hashes"}
 | 
			
		||||
    @ability.can :create, Range, :bar => 123, :array => %w[skip arrays]
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user