Spec-Zone.ru › Ruby on Rails 6.0

модуль ActiveModel::Callbacks

Включенные модули:
ActiveSupport::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 в вашем классе.

ПРИМЕЧАНИЕ: Вызов одного и того же обработчика событий несколько раз перезапишет предыдущие определения обработчика событий.

Публичные методы экземпляра

define_model_callbacks(*callbacks) Показать исходный код
# 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, где вы можете выбрать, хотите ли вы все типы (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_<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–2019 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API