2012-12-18 106 views
3

我想改变现有项目中的I18n.translate方法。猴子补丁模块方法

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

这产生:

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

我做什么错了,我应该把这个代码?

+0

你是指'require'i18n''?注意区分大小写。 – nurettin

+0

更改后,我得到: 未捕获的异常:模块“I18n”的未定义方法'translate' – Jonas

回答

8

配置/区域设置/ 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”

+0

模块方法是“静态的”(即需要以self开始),因为它们不绑定到实例。这就是为什么我把你的猴子补丁放在一个块中。 – nurettin

+0

这是一个很好的答案。如果你使用'alias_method_chain',你只需要一个声明。见[这里](http://api.rubyonrails.org/v3.2.15/classes/Module.html#method-i-alias_method_chain) –