instance method
define_callbacks
Ruby on Rails 4.1.16
Since v2.2.3Signature
define_callbacks(*names)
Define sets of events in the object life cycle that support callbacks.
define_callbacks :validate define_callbacks :initialize, :save, :destroy
Options
-
:terminator- Determines when a before filter will halt the callback chain, preventing following callbacks from being called and the event from being triggered. This should be a lambda to be executed. The current object and the return result of the callback will be called with the lambda.define_callbacks :validate, terminator: ->(target, result) { result == false }
In this example, if any before validate callbacks returns
false, other callbacks are not executed. Defaults tofalse, meaning no value halts the chain. -
:skip_after_callbacks_if_terminated- Determines if after callbacks should be terminated by the:terminatoroption. By default after callbacks executed no matter if callback chain was terminated or not. Option makes sense only when:terminatoroption is specified. -
:scope- Indicates which methods should be executed when an object is used as a callback.class Audit def before(caller) puts 'Audit: before is called' end def before_save(caller) puts 'Audit: before_save is called' end end class Account include ActiveSupport::Callbacks define_callbacks :save set_callback :save, :before, Audit.new def save run_callbacks :save do puts 'save in main' end end end
In the above case whenever you save an account the method
Audit#beforewill be called. On the other handdefine_callbacks :save, scope: [:kind, :name]
would trigger
Audit#before_saveinstead. That’s constructed by calling#{kind}_#{name}on the given instance. In this case “kind” is “before” and “name” is “save”. In this context:kindand:namehave special meanings::kindrefers to the kind of callback (before/after/around) and:namerefers to the method on which callbacks are being defined.A declaration like
define_callbacks :save, scope: [:name]
would call
Audit#save.
Parameters
-
namesrest
Source
# File activesupport/lib/active_support/callbacks.rb, line 761
def define_callbacks(*names)
options = names.extract_options!
if options.key?(:terminator) && String === options[:terminator]
ActiveSupport::Deprecation.warn "String based terminators are deprecated, please use a lambda"
value = options[:terminator]
line = class_eval "lambda { |result| #{value} }", __FILE__, __LINE__
options[:terminator] = lambda { |target, result| target.instance_exec(result, &line) }
end
names.each do |name|
class_attribute "_#{name}_callbacks", instance_writer: false
set_callbacks name, CallbackChain.new(name, options)
end
end
Defined in activesupport/lib/active_support/callbacks.rb line 761
· View on GitHub
· Improve this page
· Find usages on GitHub
Defined in ActiveSupport::Callbacks::ClassMethods