diff --git a/activemodel/lib/active_model/attribute_assignment.rb b/activemodel/lib/active_model/attribute_assignment.rb index 9bdec0dfda..ea4dae101c 100644 --- a/activemodel/lib/active_model/attribute_assignment.rb +++ b/activemodel/lib/active_model/attribute_assignment.rb @@ -26,13 +26,12 @@ module ActiveModel # cat.name # => 'Gorby' # cat.status # => 'sleeping' def assign_attributes(new_attributes) - if !new_attributes.respond_to?(:stringify_keys) + unless new_attributes.respond_to?(:each_pair) raise ArgumentError, "When assigning attributes, you must pass a hash as an argument, #{new_attributes.class} passed." end return if new_attributes.empty? - attributes = new_attributes.stringify_keys - _assign_attributes(sanitize_for_mass_assignment(attributes)) + _assign_attributes(sanitize_for_mass_assignment(new_attributes)) end alias attributes= assign_attributes @@ -49,7 +48,7 @@ module ActiveModel if respond_to?(setter) public_send(setter, v) else - raise UnknownAttributeError.new(self, k) + raise UnknownAttributeError.new(self, k.to_s) end end end diff --git a/activemodel/test/cases/attribute_assignment_test.rb b/activemodel/test/cases/attribute_assignment_test.rb index 30e8419685..4352714f12 100644 --- a/activemodel/test/cases/attribute_assignment_test.rb +++ b/activemodel/test/cases/attribute_assignment_test.rb @@ -49,8 +49,8 @@ class AttributeAssignmentTest < ActiveModel::TestCase @parameters end - def stringify_keys - dup + def each_pair(&block) + @parameters.each_pair(&block) end def dup diff --git a/activerecord/lib/active_record/attribute_assignment.rb b/activerecord/lib/active_record/attribute_assignment.rb index acb8ba7e5a..2882b1b583 100644 --- a/activerecord/lib/active_record/attribute_assignment.rb +++ b/activerecord/lib/active_record/attribute_assignment.rb @@ -6,16 +6,22 @@ module ActiveRecord module AttributeAssignment include ActiveModel::AttributeAssignment + def assign_attributes(attributes) + super(attributes.dup) + end + private def _assign_attributes(attributes) multi_parameter_attributes = {} nested_parameter_attributes = {} attributes.each do |k, v| - if k.include?("(") - multi_parameter_attributes[k] = attributes.delete(k) + key = k.to_s + + if key.include?("(") + multi_parameter_attributes[key] = attributes.delete(k) elsif v.is_a?(Hash) - nested_parameter_attributes[k] = attributes.delete(k) + nested_parameter_attributes[key] = attributes.delete(k) end end super(attributes) diff --git a/activerecord/test/support/stubs/strong_parameters.rb b/activerecord/test/support/stubs/strong_parameters.rb index da8f9892f9..8e57c7e776 100644 --- a/activerecord/test/support/stubs/strong_parameters.rb +++ b/activerecord/test/support/stubs/strong_parameters.rb @@ -28,8 +28,8 @@ class ProtectedParams end alias to_unsafe_h to_h - def stringify_keys - dup + def each_pair(&block) + @parameters.each_pair(&block) end def dup