модуль ActiveModel::Callbacks
Обработчики событий Active Model
Предоставляет интерфейс для любого класса, чтобы иметь обработчики событий, как в Active Record.
Как и методы Active Record, цепочка обработчиков событий прерывается, как только один из методов генерирует :abort.
Сначала расширьте ActiveModel::Callbacks в классе, который вы создаёте:
class MyModel extend ActiveModel::Callbacks end
Затем определите список методов, к которым вы хотите прикрепить обработчики событий:
define_model_callbacks :create, :update
Это обеспечит все три стандартных обработчика событий (before, around и after) для обоих методов :create и :update. Для реализации вам нужно обернуть методы, к которым вы хотите прикрепить обработчики, в блок, чтобы обработчики событий имели возможность сработать:
def create
run_callbacks :create do
# Your create action methods here
end
end
Затем в вашем классе вы можете использовать методы before_create, after_create и around_create, как и в модели Active Record.
before_create :action_before_create def action_before_create # Your code here end
При определении обработчика around не забудьте передать блок, в противном случае он не будет выполнен:
around_create :log_status def log_status puts 'going to call the block...' yield puts 'block successfully called.' end
Вы можете выбрать, чтобы были только определенные обработчики событий, передав хэш в метод define_model_callbacks.
define_model_callbacks :create, only: [:after, :before]
Это создаст только методы обработчиков событий after_create и before_create в вашем классе.
ПРИМЕЧАНИЕ: Вызов одного и того же обработчика событий несколько раз перезапишет предыдущие определения обработчика.
Методы публичного экземпляра
# File activemodel/lib/active_model/callbacks.rb, line 108
def define_model_callbacks(*callbacks)
options = callbacks.extract_options!
options = {
skip_after_callbacks_if_terminated: true,
scope: [:kind, :name],
only: [:before, :around, :after]
}.merge!(options)
types = Array(options.delete(:only))
callbacks.each do |callback|
define_callbacks(callback, options)
types.each do |type|
send("_define_#{type}_model_callback", self, callback)
end
end
end #define_model_callbacks принимает те же параметры, что и define_callbacks, в случае если вы хотите перезаписать значения по умолчанию. Помимо этого, он также принимает параметр :only, где вы можете выбрать, хотите ли вы все типы (before, around или after) или только некоторые.
define_model_callbacks :initializer, only: :after
Обратите внимание, что хэш only: <type> будет применён ко всем обработчикам событий, определённым в этом вызове метода. Чтобы обойти это, вы можете вызывать метод #define_model_callbacks столько раз, сколько нужно.
define_model_callbacks :create, only: :after define_model_callbacks :update, only: :before define_model_callbacks :destroy, only: :around
Создаст только методы after_create, before_update и around_destroy.
Вы можете передать класс в before_<тип>, after_<тип> и around_<тип>, в этом случае обработчик вызовет метод <действие>_<тип> этого класса, передав объект, на котором вызывается обработчик.
class MyModel
extend ActiveModel::Callbacks
define_model_callbacks :create
before_create AnotherClass
end
class AnotherClass
def self.before_create( obj )
# obj is the MyModel instance that the callback is being called on
end
end
ПРИМЕЧАНИЕ: method_name значение, переданное в #define_model_callbacks, не должно заканчиваться на !, ? или =.
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.