Могу ли я сделать патч для существующего ActiveRecord Observer? - PullRequest
1 голос
/ 24 декабря 2010

Я пытаюсь обезопасить существующий ActiveRecord Observer; в частности, IssueObserver из базы кода Redmine 1.0.4.

В плагине init.rb я включаю файл *patch.rb:

require File.join(File.dirname(__FILE__), 'lib/issue_observer_patch.rb')
IssueObserver.send :include, IssueObserverPatch

Это делается вне блока Redmine::Plugin.register.

Модуль делает что-то вроде:

module IssueObserverPatch
  def self.included(base)
    base.send :alias_method_chain, :after_create, :audit
  end

  def after_create_with_audit(issue)
    after_create_without_audit(issue)
    issue.logger.info('***'*50)
    # Insert a new Audit instance.
  end
end

Однако, когда я запускаю сервер (используя script/server, который использует Mongrel), патч, похоже, ничего не делает. Строка ***..*** не регистрируется при создании новой проблемы.

Путем изменения IssueObserver и включения предложения для записи события after_create, а затем запуска сервера и создания проблемы; Я вижу этот журнал, но не метод входа after_create_with_audit.

Есть ли какой-нибудь правильный способ исправления Обозревателя ActiveRecord?

1 Ответ

0 голосов
/ 03 января 2011

Кажется, что Rails VM загружаются и выгружаются по требованию. Таким образом, изменение кода в файле init.rb на следующее решает проблему:

config.to_prepare do
  IssueObserver.send :include, IssueObserverPatch
end

Это заставляет этот блок кода выполняться для каждой виртуальной машины в процессе производства и для каждого запроса в процессе разработки.

...