module ActiveAdmin::Callbacks::ClassMethods

Private Instance Methods

define_active_admin_callbacks(*names) click to toggle source

Define a new callback.

Example:

class MyClassWithCallbacks
  include ActiveAdmin::Callbacks

  define_active_admin_callbacks :save

  before_save do |arg1, arg2|
    # runs before save
  end

  after_save :call_after_save

  def save
    # Will run before, yield, then after
    run_save_callbacks :arg1, :arg2 do
      save!
    end
  end

  protected

  def call_after_save(arg1, arg2)
    # runs after save
  end
end
# File lib/active_admin/callbacks.rb, line 59
def define_active_admin_callbacks(*names)
  names.each do |name|
    [:before, :after].each do |type|
      callback_name = "#{type}_#{name}_callbacks"
      callback_ivar = "@#{callback_name}"

      # def self.before_create_callbacks
      singleton_class.send :define_method, callback_name do
        instance_variable_get(callback_ivar) || instance_variable_set(callback_ivar, [])
      end
      singleton_class.send :private, callback_name

      # def self.before_create
      singleton_class.send :define_method, "#{type}_#{name}" do |method = nil, &block|
        send(callback_name).push method || block
      end
    end

    # def run_create_callbacks
    define_method "run_#{name}_callbacks" do |*args, &block|
      self.class.send("before_#{name}_callbacks").each { |cbk| run_callback(cbk, *args) }
      value = block.try :call
      self.class.send("after_#{name}_callbacks").each { |cbk| run_callback(cbk, *args) }
      return value
    end
    send :private, "run_#{name}_callbacks"
  end
end