我可以修补现有的ActiveRecord Observer吗?

时间:2010-12-24 01:26:12

标签: ruby-on-rails activerecord redmine

我正试图修补现有的ActiveRecord Observer;特别是来自Redmine 1.0.4代码库的IssueObserver。

在插件的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

但是,当我运行服务器时(使用使用Mongrel的script/server),补丁似乎什么都不做。当我创建新问题时,***..***字符串不会被记录。

通过更改IssueObserver并包含一个句子来记录after_create事件,然后运行服务器并创建一个问题;我可以看到此日志,但不能登录after_create_with_audit方法。

是否有适当的方法来修补ActiveRecord Observer?

1 个答案:

答案 0 :(得分:0)

似乎Rails VM按需加载和卸载。因此,将init.rb上的代码更改为以下内容可以解决问题:

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

这使得这个代码块可以在生产中按照每个VM执行,也可以在开发时按请求执行。