support has_many association or arrays in can conditions hash

This commit is contained in:
Ryan Bates 2010-04-22 17:39:22 -07:00
parent e20081454f
commit 06296b0a40
3 changed files with 13 additions and 1 deletions

View File

@ -1,3 +1,5 @@
* Support has_many association or arrays in can conditions hash
* Adding joins clause to accessible_by when conditions are across associations * Adding joins clause to accessible_by when conditions are across associations
1.1.1 (April 17, 2010) 1.1.1 (April 17, 2010)

View File

@ -65,7 +65,11 @@ module CanCan
conditions.all? do |name, value| conditions.all? do |name, value|
attribute = subject.send(name) attribute = subject.send(name)
if value.kind_of?(Hash) if value.kind_of?(Hash)
matches_conditions? attribute, value if attribute.kind_of? Array
attribute.any? { |element| matches_conditions? element, value }
else
matches_conditions? attribute, value
end
elsif value.kind_of?(Array) || value.kind_of?(Range) elsif value.kind_of?(Array) || value.kind_of?(Range)
value.include? attribute value.include? attribute
else else

View File

@ -168,6 +168,12 @@ describe CanCan::Ability do
@ability.can?(:read, ["test1", "foo"]).should be_true @ability.can?(:read, ["test1", "foo"]).should be_true
end end
it "should allow nested hash of arrays and match any element" do
@ability.can :read, Array, :first => { :to_i => 3 }
@ability.can?(:read, [[1, 2, 3]]).should be_true
@ability.can?(:read, [[4, 5, 6]]).should be_false
end
it "should return conditions for a given ability" do it "should return conditions for a given ability" do
@ability.can :read, Array, :first => 1, :last => 3 @ability.can :read, Array, :first => 1, :last => 3
@ability.conditions(:show, Array).should == {:first => 1, :last => 3} @ability.conditions(:show, Array).should == {:first => 1, :last => 3}