| 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
- Order of the state_machine callback chain and how to abort it.
- Rails 5 does not halt callback chain if false is returned Show archive.org snapshot
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
Posted by Henning Koch to makandra dev (2013-12-05 08:31)