diff --git a/lib/cancan/can_definition.rb b/lib/cancan/can_definition.rb index 718ad38..ea679e5 100644 --- a/lib/cancan/can_definition.rb +++ b/lib/cancan/can_definition.rb @@ -34,16 +34,21 @@ module CanCan end end - # Returns a hash of conditions, pluralizing the table names - def tableized_conditions - if @conditions - @conditions.inject({}) do |tableized_conditions, (name, value)| - name = name.to_s.tableize.to_sym if value.kind_of? Hash - tableized_conditions[name] = value - tableized_conditions - end - end - end + def tableized_conditions(c=nil) + conditions = c || @conditions + if conditions + conditions.inject({}) do |tableized_conditions, (name, value)| + if value.kind_of? Hash + name = name.to_s.tableize.to_sym + value = tableized_conditions(value) + end + tableized_conditions[name] = value + tableized_conditions + end + end + end + + def only_block? conditions_empty? && !@block.nil? diff --git a/spec/cancan/can_definition_spec.rb b/spec/cancan/can_definition_spec.rb index a11efb8..7732815 100644 --- a/spec/cancan/can_definition_spec.rb +++ b/spec/cancan/can_definition_spec.rb @@ -30,6 +30,16 @@ describe CanCan::CanDefinition do @conditions[:foo] = {:bar => {1 => 2}} @can.associations_hash.should == {:foo => {:bar => {}}} end + it "should tableize correctly for absurdly complex permissions" do + @conditions[:unit] = {:property=>{:landlord=>{:weasle_id=>560}}} + @conditions[:test] = 1 + @can.tableized_conditions.should == {:units => {:properties => {:landlords=>{:weasle_id=>560}}}, :test => 1} + end + it "should tableize correctly for complex permissions" do + @conditions[:unit] = {:property=>{:landlord_id=>560}} + @conditions[:test] = 1 + @can.tableized_conditions.should == {:units => {:properties => {:landlord_id=>560}}, :test => 1} + end it "should return table names in conditions for association joins" do @conditions[:foo] = {:bar => 1}