Cancelling the ActiveRecord callback chain

Updated . Posted . Visible to the public. Repeats.
Goal Within before_* Within after_*
Cancel later callbacks throw :abort throw :abort
Rollback the transaction throw :abort raise ActiveRecord::Rollback

When a callback raises an error

Exceptions raised in callbacks always rollback the transaction, but only exceptions that are not ActiveRecord::Rollback will bubble up to the caller.

Further reading

Legacy Rails versions (1-4)

Goal Rails version Within before_* Within after_*
Cancel later callbacks Rails 1-4 return false return false
Rollback the transaction Rails 1-4 return false raise ActiveRecord::Rollback

Take care that your callbacks don't accidentally return false, since that cancels the chain in Rails 1-4 (returning nil is fine, though). Since in Ruby the last expression of a method becomes its return value automatically, this can happen accidentally:

before_save :callback

def callback
  call_to_method_that_happens_to_return_false
end

If uncertain, return true explicitely:

before_save :callback

def callback
  call_to_method_that_happens_to_return_false
  true
end
Henning Koch
Last edit
Dominik Schöler
Keywords
before_validation, after_validation, before_save, after_save, before_update, after_update, before_create, after_create
License
Source code in this card is licensed under the MIT License.
Posted by Henning Koch to makandra dev (2013-12-05 08:31)