Callbacks are hooks into the lifecycle of an object that allow you to trigger logic before or after an alteration of the object state.

Mixing in this module allows you to define callbacks in your class.

Example:

class Storage
  include ActiveSupport::Callbacks
  define_callbacks :before_save, :after_save
end
class ConfigStorage < Storage
  before_save :saving_message
  def saving_message
    puts "saving..."
  end
  after_save do |object|
    puts "saved"
  end
  def save
    run_callbacks(:before_save)
    puts "- save"
    run_callbacks(:after_save)
  end
end
config = ConfigStorage.new
config.save

Output:

saving...
- save
saved

Callbacks from parent classes are inherited.

Example:

class Storage
  include ActiveSupport::Callbacks
  define_callbacks :before_save, :after_save
  before_save :prepare
  def prepare
    puts "preparing save"
  end
end
class ConfigStorage < Storage
  before_save :saving_message
  def saving_message
    puts "saving..."
  end
  after_save do |object|
    puts "saved"
  end
  def save
    run_callbacks(:before_save)
    puts "- save"
    run_callbacks(:after_save)
  end
end
config = ConfigStorage.new
config.save

Output:

preparing save
saving...
- save
saved
Namespace
Methods
I
R
Class Public methods
included(base)
# File activesupport/lib/active_support/callbacks.rb, line 200
def self.included(base)
  base.extend ClassMethods
end
Instance Public methods
run_callbacks(kind, options = {}, &block)

Runs all the callbacks defined for the given options.

If a block is given it will be called after each callback receiving as arguments:

* the result from the callback
* the object which has the callback

If the result from the block evaluates to false, the callback chain is stopped.

Example:

class Storage
  include ActiveSupport::Callbacks
  define_callbacks :before_save, :after_save
end
class ConfigStorage < Storage
  before_save :pass
  before_save :pass
  before_save :stop
  before_save :pass
  def pass
    puts "pass"
  end
  def stop
    puts "stop"
    return false
  end
  def save
    result = run_callbacks(:before_save) { |result, object| result == false }
    puts "- save" if result
  end
end
config = ConfigStorage.new
config.save

Output:

pass
pass
stop
# File activesupport/lib/active_support/callbacks.rb, line 275
def run_callbacks(kind, options = {}, &block)
  self.class.send("#{kind}_callback_chain").run(self, options, &block)
end