diff options
author | Ryuta Kamizono <kamipo@gmail.com> | 2018-04-10 13:18:34 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-04-10 13:18:34 +0900 |
commit | eb3740dcb0c2cc648aea13116628d257bc7ebc3b (patch) | |
tree | 5bb6140ee50973889228418c66d4bd0e04cfea88 | |
parent | 36ce219ca08f7768a402f846d202f3c5b370718e (diff) | |
parent | 80a09caedc6fa67f95e78e45e7eb954f6b647b2c (diff) | |
download | rails-eb3740dcb0c2cc648aea13116628d257bc7ebc3b.tar.gz rails-eb3740dcb0c2cc648aea13116628d257bc7ebc3b.tar.bz2 rails-eb3740dcb0c2cc648aea13116628d257bc7ebc3b.zip |
Merge pull request #32498 from eugeneius/mutation_tracker_merge_changes
Prevent changes_to_save from mutating attributes
-rw-r--r-- | activemodel/lib/active_model/attribute_mutation_tracker.rb | 2 | ||||
-rw-r--r-- | activerecord/test/cases/dirty_test.rb | 8 |
2 files changed, 9 insertions, 1 deletions
diff --git a/activemodel/lib/active_model/attribute_mutation_tracker.rb b/activemodel/lib/active_model/attribute_mutation_tracker.rb index 82d90664c0..6abf37bd44 100644 --- a/activemodel/lib/active_model/attribute_mutation_tracker.rb +++ b/activemodel/lib/active_model/attribute_mutation_tracker.rb @@ -27,7 +27,7 @@ module ActiveModel attr_names.each_with_object({}.with_indifferent_access) do |attr_name, result| change = change_to_attribute(attr_name) if change - result[attr_name] = change + result.merge!(attr_name => change) end end end diff --git a/activerecord/test/cases/dirty_test.rb b/activerecord/test/cases/dirty_test.rb index 2f1434b2bc..5c7f70b7a0 100644 --- a/activerecord/test/cases/dirty_test.rb +++ b/activerecord/test/cases/dirty_test.rb @@ -473,6 +473,14 @@ class DirtyTest < ActiveRecord::TestCase end end + def test_changes_to_save_should_not_mutate_array_of_hashes + topic = Topic.new(author_name: "Bill", content: [{ a: "a" }]) + + topic.changes_to_save + + assert_equal [{ a: "a" }], topic.content + end + def test_previous_changes # original values should be in previous_changes pirate = Pirate.new |