aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib
diff options
context:
space:
mode:
authorMark McSpadden <markmcspadden@gmail.com>2012-03-21 04:34:32 -0400
committerMark McSpadden <markmcspadden@gmail.com>2012-03-21 04:35:28 -0400
commitc8792c7b2ea4f5fe7a5610225433ea8dd8d0f83e (patch)
tree8d297eebafd05b81a5d72f981dc06678943633b8 /activerecord/lib
parent14b2cf6a0ae2bfd60efb7c3146145bf005853cc3 (diff)
downloadrails-c8792c7b2ea4f5fe7a5610225433ea8dd8d0f83e.tar.gz
rails-c8792c7b2ea4f5fe7a5610225433ea8dd8d0f83e.tar.bz2
rails-c8792c7b2ea4f5fe7a5610225433ea8dd8d0f83e.zip
Allow manual rollbacks in after_save to reset object correctly
Diffstat (limited to 'activerecord/lib')
-rw-r--r--activerecord/lib/active_record/transactions.rb10
1 files changed, 9 insertions, 1 deletions
diff --git a/activerecord/lib/active_record/transactions.rb b/activerecord/lib/active_record/transactions.rb
index 743dfc5a38..64107d86a8 100644
--- a/activerecord/lib/active_record/transactions.rb
+++ b/activerecord/lib/active_record/transactions.rb
@@ -290,7 +290,15 @@ module ActiveRecord
status = nil
self.class.transaction do
add_to_transaction
- status = yield
+ begin
+ status = yield
+ rescue ActiveRecord::Rollback
+ if defined?(@_start_transaction_state)
+ @_start_transaction_state[:level] = (@_start_transaction_state[:level] || 0) - 1
+ end
+ status = nil
+ end
+
raise ActiveRecord::Rollback unless status
end
status