diff options
author | Sean Griffin <sean@thoughtbot.com> | 2015-07-20 09:12:09 -0600 |
---|---|---|
committer | Sean Griffin <sean@thoughtbot.com> | 2015-07-20 09:12:09 -0600 |
commit | c0f79be895796562e38e3fbd35d2741ee3fb85a5 (patch) | |
tree | fc2cc53a6795ee099fec878e4c33f7337f05b476 | |
parent | c0ef95a1c6db3095c4b5f80f8044fbbbdfebeff1 (diff) | |
parent | 12b0b26df7560ab5199ba830586864085441508f (diff) | |
download | rails-c0f79be895796562e38e3fbd35d2741ee3fb85a5.tar.gz rails-c0f79be895796562e38e3fbd35d2741ee3fb85a5.tar.bz2 rails-c0f79be895796562e38e3fbd35d2741ee3fb85a5.zip |
Merge pull request #20947
-rw-r--r-- | actionpack/test/controller/parameters/parameters_permit_test.rb | 2 | ||||
-rw-r--r-- | activerecord/CHANGELOG.md | 14 | ||||
-rw-r--r-- | activerecord/lib/active_record/transactions.rb | 4 | ||||
-rw-r--r-- | activerecord/test/cases/transactions_test.rb | 7 |
4 files changed, 26 insertions, 1 deletions
diff --git a/actionpack/test/controller/parameters/parameters_permit_test.rb b/actionpack/test/controller/parameters/parameters_permit_test.rb index 2dd2826196..9f7d14e85d 100644 --- a/actionpack/test/controller/parameters/parameters_permit_test.rb +++ b/actionpack/test/controller/parameters/parameters_permit_test.rb @@ -199,7 +199,7 @@ class ParametersPermitTest < ActiveSupport::TestCase assert_equal nil, @params.fetch(:foo) { nil } end - test 'KeyError in fetch block should not be coverd up' do + test 'KeyError in fetch block should not be covered up' do params = ActionController::Parameters.new e = assert_raises(KeyError) do params.fetch(:missing_key) { {}.fetch(:also_missing) } diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md index aa2438fb3f..d9aa703d19 100644 --- a/activerecord/CHANGELOG.md +++ b/activerecord/CHANGELOG.md @@ -1,3 +1,17 @@ +* Fix state being carried over from previous transaction. + + Considering the following example where `name` is a required attribute. + Before we had `new_record?` returning `true` for a persisted record: + + author = Author.create! name: 'foo' + author.name = nil + author.save # => false + author.new_record? # => true + + Fixes #20824. + + *Roque Pinel* + * Correctly ignore `mark_for_destruction` when `autosave` isn't set to `true` when validating associations. diff --git a/activerecord/lib/active_record/transactions.rb b/activerecord/lib/active_record/transactions.rb index 267ac26c79..887d7a5903 100644 --- a/activerecord/lib/active_record/transactions.rb +++ b/activerecord/lib/active_record/transactions.rb @@ -379,6 +379,10 @@ module ActiveRecord raise ActiveRecord::Rollback unless status end status + ensure + if @transaction_state && @transaction_state.committed? + clear_transaction_record_state + end end protected diff --git a/activerecord/test/cases/transactions_test.rb b/activerecord/test/cases/transactions_test.rb index 4e163ca4a6..29a6ec7522 100644 --- a/activerecord/test/cases/transactions_test.rb +++ b/activerecord/test/cases/transactions_test.rb @@ -175,6 +175,13 @@ class TransactionTest < ActiveRecord::TestCase assert topic.new_record?, "#{topic.inspect} should be new record" end + def test_transaction_state_is_cleared_when_record_is_persisted + author = Author.create! name: 'foo' + author.name = nil + assert_not author.save + assert_not author.new_record? + end + def test_update_should_rollback_on_failure author = Author.find(1) posts_count = author.posts.size |