2012-12-18 153 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) –