diff options
author | Yuya Tanaka <yuya.presto@gmail.com> | 2018-08-22 20:00:19 +0900 |
---|---|---|
committer | Yuya Tanaka <yuya.presto@gmail.com> | 2018-08-28 16:32:23 +0900 |
commit | 34f075fe5666dcf924606f8af2537b83b7b5139f (patch) | |
tree | 30c11dda125da7385954802dfa2093a0ff7e04fd /activerecord/test | |
parent | 1353610ff2ab4d16d022d5c31d5b4e5d908e05a8 (diff) | |
download | rails-34f075fe5666dcf924606f8af2537b83b7b5139f.tar.gz rails-34f075fe5666dcf924606f8af2537b83b7b5139f.tar.bz2 rails-34f075fe5666dcf924606f8af2537b83b7b5139f.zip |
Mutation tracker should be cleared before continuing around callbacks
`changes_applied` should be called before continuing around callback
chain. Otherwise the mutation tracker returns old value for methods like
`changed`? or `id_in_database` in around callbacks. Also methods depend
on `id_in_database`, like `update_column`, are not working in
`around_create` callbacks.
```
class Foo < ActiveRecord::Base
around_create :around_create_callback
def around_create_callback
...
yield
p id_in_database # => nil
update_column(:generated_column, generate_value) # silently fails
end
...
end
```
Diffstat (limited to 'activerecord/test')
-rw-r--r-- | activerecord/test/cases/dirty_test.rb | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/activerecord/test/cases/dirty_test.rb b/activerecord/test/cases/dirty_test.rb index 83cc2aa319..1f0e770a93 100644 --- a/activerecord/test/cases/dirty_test.rb +++ b/activerecord/test/cases/dirty_test.rb @@ -879,6 +879,26 @@ class DirtyTest < ActiveRecord::TestCase raise "changed? should be false" if changed? raise "has_changes_to_save? should be false" if has_changes_to_save? raise "saved_changes? should be true" unless saved_changes? + raise "id_in_database should not be nil" if id_in_database.nil? + end + end + + person = klass.create!(first_name: "Sean") + assert_not_predicate person, :changed? + end + + test "changed? in around callbacks after yield returns false" do + klass = Class.new(ActiveRecord::Base) do + self.table_name = "people" + + around_create :check_around + + def check_around + yield + raise "changed? should be false" if changed? + raise "has_changes_to_save? should be false" if has_changes_to_save? + raise "saved_changes? should be true" unless saved_changes? + raise "id_in_database should not be nil" if id_in_database.nil? end end |