модуль ActiveModel::Callbacks
Колбэки Active Model
Предоставляет любому классу интерфейс для добавления колбэков, аналогичных колбэкам Active Record.
Как и в методах Active Record, цепочка колбэков прерывается, как только один из методов выбрасывает :abort.
Сначала подключите ActiveModel::Callbacks в создаваемом вами классе:
class MyModel extend ActiveModel::Callbacks end
Затем определите список методов, для которых нужно добавить колбэки:
define_model_callbacks :create, :update
Это предоставит все три стандартных колбэка (до, вокруг и после) для методов :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 не забудьте выполнить yield для блока, иначе он не будет выполнен:
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 109
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, с помощью которого можно выбрать все типы (до, вокруг или после) или только некоторые из них.
define_model_callbacks :initialize, 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_<type>, after_<type> и around_<type> можно передать класс; в этом случае колбэк вызовет у этого класса метод <action>_<type>, передав ему объект, для которого вызывается колбэк.
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–2021 David Heinemeier Hansson
Licensed under the MIT License.