【问题标题】:Monkey patch module method猴子补丁模块方法
【发布时间】:2012-12-18 07:46:26
【问题描述】:

我想更改现有项目中的 I18n.translate 方法。

require 'I18n'
module I18n
  alias_method :old_translate, :translate
  def translate(*args)
    old_translate(*args) + 'blabla'
  end
  alias_method :t, :translate
end

这会生成:

未捕获的异常:缺少帮助文件 helpers/I18n.rb

我做错了什么,我应该把这段代码放在哪里?

【问题讨论】:

  • 你的意思是require 'i18n' 吗?注意区分大小写。
  • 更改后,我得到:未捕获的异常:未定义的方法translate' for module I18n'

标签: ruby-on-rails-3 monkeypatching rails-i18n


【解决方案1】:

config/locales/en.yml:

en:
  wtfblabla: hello

test.rb:

require 'i18n'
module I18n
  class<< self
    alias_method :old_translate, :translate
    def translate(*args)
      old_translate(*args) + 'blabla'
    end
    alias_method :t, :translate
  end
end

I18n.load_path += p(Dir[File.join(File.dirname(__FILE__), 'config', 'locales', '*.yml').to_s])

p I18n.t "wtfblabla"

输出:

["./config/locales/en.yml"]

“helloblabla”

【讨论】:

  • 模块方法是“静态的”(即需要以 self 开头),因为它们不绑定到实例。这就是为什么我把你的猴子补丁放在一个自我块中。
  • 这是一个很好的答案。如果你使用alias_method_chain,你只需要一份声明。见here
猜你喜欢
  • 1970-01-01
  • 2012-08-19
  • 1970-01-01
  • 1970-01-01
  • 2013-04-14
  • 2012-07-26
  • 1970-01-01
  • 2016-09-01
  • 2012-09-16
相关资源
最近更新 更多