модуль ActiveSupport::Callbacks
Обработчики событий — это крючки кода, которые выполняются в ключевые моменты жизненного цикла объекта. Типичный пример использования — определение набора обработчиков событий в базовом классе, относящихся к другим функциям, так, чтобы подклассы могли устанавливать обработчики, которые улучшают или изменяют базовую функциональность без необходимости переопределять или переписывать методы базового класса.
Включение этого модуля позволяет определить события в жизненном цикле объекта, которые будут поддерживать обработчики событий (через ClassMethods.define_callbacks), установить методы экземпляра, проги или объекты обработчиков, которые будут вызываться (через ClassMethods.set_callback), и запустить установленные обработчики в соответствующее время (через run_callbacks).
Поддерживаются три типа обработчиков: до события (before), выполняющиеся перед определенным событием; после события (after), выполняющиеся после события; и обработчики типа «вокруг» (around), блоки, которые окружают событие, вызывая его, когда они передают управление. Код обработчика может содержаться в методах экземпляра, прогах или лямбда-функциях, или объектах обработчиков, которые отвечают на определенные предопределенные методы. Подробности см. в ClassMethods.set_callback.
class Record
include ActiveSupport::Callbacks
define_callbacks :save
def save
run_callbacks :save do
puts "- save"
end
end
end
class PersonRecord < Record
set_callback :save, :before, :saving_message
def saving_message
puts "saving..."
end
set_callback :save, :after do |object|
puts "saved"
end
end
person = PersonRecord.new
person.save
Вывод:
saving... - save saved
Константы
- CALLBACK_FILTER_TYPES
Публичные методы экземпляров
Выполняет обработчики событий для данного события.
Вызывает обработчики «до события» и «вокруг» в порядке их установки, передает управление блоку (если он задан), а затем выполняет обработчики «после события» в обратном порядке.
Если цепочка обработчиков была остановлена, возвращает false. В противном случае возвращает результат блока или true, если блок не задан.
run_callbacks :save do save end
# File activesupport/lib/active_support/callbacks.rb, line 79
def run_callbacks(kind, &block)
cbs = send("_#{kind}_callbacks")
if cbs.empty?
yield if block_given?
else
runner = cbs.compile
e = Filters::Environment.new(self, false, nil, block)
runner.call(e).value
end
end
© 2004–2016 David Heinemeier Hansson
Licensed under the MIT License.