instance method
define_callbacks
Ruby on Rails 6.1.7.10
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 before and around callbacks from being called and the event from being triggered. This should be a lambda to be executed. The current object and the result lambda of the callback will be provided to the terminator lambda.define_callbacks :validate, terminator: ->(target, result_lambda) { result_lambda.call == false }
In this example, if any before validate callbacks returns
false, any successive before and around callback is not executed.The default terminator halts the chain when a callback throws
:abort. -
:skip_after_callbacks_if_terminated- Determines if after callbacks should be terminated by the:terminatoroption. By default after callbacks are executed no matter if callback chain was terminated or not. This option has no effect if:terminatoroption is set tonil. -
: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.
Notes
names passed to define_callbacks must not end with !, ? or =.
Calling define_callbacks multiple times with the same names will overwrite previous callbacks registered with set_callback.
Parameters
-
namesrest
Source
# File activesupport/lib/active_support/callbacks.rb, line 812
def define_callbacks(*names)
options = names.extract_options!
names.each do |name|
name = name.to_sym
([self] + ActiveSupport::DescendantsTracker.descendants(self)).each do |target|
target.set_callbacks name, CallbackChain.new(name, options)
end
module_eval <<-RUBY, __FILE__, __LINE__ + 1
def _run_#{name}_callbacks(&block)
run_callbacks #{name.inspect}, &block
end
def self._#{name}_callbacks
get_callbacks(#{name.inspect})
end
def self._#{name}_callbacks=(value)
set_callbacks(#{name.inspect}, value)
end
def _#{name}_callbacks
__callbacks[#{name.inspect}]
end
RUBY
end
end
Defined in activesupport/lib/active_support/callbacks.rb line 812
· View on GitHub
· Improve this page
· Find usages on GitHub
Defined in ActiveSupport::Callbacks::ClassMethods