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

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

Henning Koch Over 10 years ago