ActiveSupport:: Обратные вызовы для методов класса
Можно ли использовать ActiveSupport::Callbacks
на методы класса? Более конкретно, в модуле ниже, куда бы вы положили include ActiveSupport::Callbacks
делать define_callbacks
а также run_callbacks
поделитесь тем же состоянием?
module Handler
extend ActiveSupport::Concern
# If you put it here, define_callbacks is defined but run_callbacks is not
# include ActiveSupport::Callbacks
included do
class_eval do
define_callbacks :handle
end
end
module ClassMethods
# If you put it here, run_callbacks is defined but define_callbacks is not
# include ActiveSupport::Callbacks
def handle(task)
run_callbacks :handle do
p task
end
end
end
end
class HandlerExample
include Handler
end
Обновить
Если это возможно, что я не смог выяснить, это, конечно, не что-то ActiveSupport::Callbacks
был разработан для. Лучше всего создать экземпляр объекта без сохранения состояния в #handle
,
1 ответ
Хотя вся идея немного неловкая ИМХО, вы уже помещаете define_callbacks в неправильное место. Вы должны были поместить ее в собственный класс, например
eval << -EOF class << self; define_callbacks..; EOF
а затем вы можете сделать "отправить: расширить, ActiveSupport::Callbacks". Это может даже работать.
Но я предлагаю вам переосмыслить это и согласиться со стандартной реализацией, где обратные вызовы вызываются в экземпляре.