Callbacks are code hooks that are run at key points in an object’s lifecycle. The typical use case is to have a base class define a set of callbacks relevant to the other functionality it supplies, so that subclasses can install callbacks that enhance or modify the base functionality without needing to override or redefine methods of the base class.
Mixing in this module allows you to define the events in the object’s
lifecycle that will support callbacks (via
ClassMethods.define_callbacks
), set the instance methods,
procs, or callback objects to be called (via
ClassMethods.set_callback
), and run the installed callbacks at
the appropriate times (via run_callbacks
).
Three kinds of callbacks are supported: before callbacks, run before a
certain event; after callbacks, run after the event; and around callbacks,
blocks that surround the event, triggering it when they yield. Callback
code can be contained in instance methods, procs or lambdas, or callback
objects that respond to certain predetermined methods. See
ClassMethods.set_callback
for details.
Example
class Record include ActiveSupport::Callbacks define_callbacks :save def save run_callbacks :save do puts "- save" end end end class PersonRecord < Record set_callback :save, :before, :saving_message def saving_message puts "saving..." end set_callback :save, :after do |object| puts "saved" end end person = PersonRecord.new person.save
Output:
saving... - save saved
Runs the callbacks for the given event.
Calls the before and around callbacks in the order they were set, yields
the block (if given one), and then runs the after callbacks in reverse
order. Optionally accepts a key, which will be used to compile an optimized
callback method for each key. See
ClassMethods.define_callbacks
for more information.
If the callback chain was halted, returns false
. Otherwise
returns the result of the block, or true
if no block is given.
run_callbacks :save do save end
Source: show
# File activesupport/lib/active_support/callbacks.rb, line 80 def run_callbacks(kind, *args, &block) send("_run_#{kind}_callbacks", *args, &block) end