| 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)