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". Это может даже работать.

Но я предлагаю вам переосмыслить это и согласиться со стандартной реализацией, где обратные вызовы вызываются в экземпляре.

Другие вопросы по тегам