Posted over 8 years ago. Visible to the public. Repeats.
Cancelling the ActiveRecord callback chain
What | Rails version | Within before_* |
Within after_* |
---|---|---|---|
Cancel later callbacks | Rails 1-4 | return false |
return false |
Cancel later callbacks | Rails 5+ | throw :abort |
throw :abort |
Rollback the transaction | Rails 1-4 | return false |
raise ActiveRecord::Rollback |
Rollback the transaction | Rails 5+ | throw :abort |
raise ActiveRecord::Rollback |
Take care that your callbacks don't accidentally return false
, since that cancels the chain in Rails 1-4. Since in Ruby the last expression of a method becomes its return value automatically, this can happen accidentally:
Copybefore_save :callback def callback call_to_method_that_happens_to_return_false end
If uncertain, return true
explicitely:
Copybefore_save :callback def callback call_to_method_that_happens_to_return_false true end
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 Archive
Your development team has a full backlog of feature requests, chores and refactoring coupled with deadlines? We are familiar with that. With our "DevOps as a Service" offering, we support developer teams with infrastructure and operations expertise.