From 37054e6eb57a1ebe330f31323d25355ff3069cb5 Mon Sep 17 00:00:00 2001 From: Xavier Noria Date: Thu, 14 Aug 2008 01:21:58 +0200 Subject: documented how to trigger rollbacks within the callback chain, and related gotchas --- activerecord/lib/active_record/callbacks.rb | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'activerecord/lib') diff --git a/activerecord/lib/active_record/callbacks.rb b/activerecord/lib/active_record/callbacks.rb index 9f3b0765ca..f1983b6496 100644 --- a/activerecord/lib/active_record/callbacks.rb +++ b/activerecord/lib/active_record/callbacks.rb @@ -172,7 +172,16 @@ module ActiveRecord # # == Transactions # - # The entire callback chain for +save+ and +destroy+ runs within their transaction. + # The entire callback chain for +save+ and +destroy+ runs within their transaction, including + # the after_* hooks. Cancellation does not trigger a rollback. To rollback + # the transaction just raise an exception the same way you do for regular transactions. + # + # Note though that such an exception bypasses the regular call chain in Active Record: + # If ActiveRecord::Rollback is raised both +save+ and +destroy+ return +nil+. On the other + # hand save! does *not* raise ActiveRecord::RecordNotSaved, and does not raise + # anything else for that matter, save! just returns +nil+ in that case. + # If any other exception is raised it goes up until it reaches the caller, no matter + # which one of the three actions was being performed. module Callbacks CALLBACKS = %w( after_find after_initialize before_save after_save before_create after_create before_update after_update before_validation -- cgit v1.2.3