Module: ActiveAdmin::Callbacks::ClassMethods

Defined in:
lib/active_admin/callbacks.rb

Instance Method Summary collapse

Instance Method Details

#define_active_admin_callbacks(*names) ⇒ Object

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


56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/active_admin/callbacks.rb', line 56

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

      # 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
  end
end