diff --git a/lib/cancan/rule.rb b/lib/cancan/rule.rb index 27355bd..9dd49c8 100644 --- a/lib/cancan/rule.rb +++ b/lib/cancan/rule.rb @@ -123,7 +123,7 @@ module CanCan end def nested_subject_matches_conditions?(subject_hash) - parent, child = subject_hash.shift + parent, child = subject_hash.first matches_conditions_hash?(parent, @conditions[parent.class.name.downcase.to_sym] || {}) end diff --git a/spec/cancan/ability_spec.rb b/spec/cancan/ability_spec.rb index a99aea5..914e601 100644 --- a/spec/cancan/ability_spec.rb +++ b/spec/cancan/ability_spec.rb @@ -306,6 +306,14 @@ describe CanCan::Ability do @ability.can?(:read, 123 => Range).should be_true end + it "passing a hash of subjects with multiple definitions should check permissions correctly" do + @ability.can :read, Range, :string => {:length => 4} + @ability.can [:create, :read], Range, :string => {:upcase => 'FOO'} + @ability.can?(:read, "foo" => Range).should be_true + @ability.can?(:read, "foobar" => Range).should be_false + @ability.can?(:read, 1234 => Range).should be_true + end + it "should allow to check ability on Hash-like object" do class Container < Hash; end @ability.can :read, Container