如何在Rails初始化程序中混合模块

时间:2012-05-21 10:54:56

标签: ruby-on-rails ruby metaprogramming

我想把我的宝石猴子补丁放到例如/lib/gem_ext/i18n.rb:

module GemExt
  module I18n
    def self.translate(*args)
      raise 'ok'
    end
  end
end

...并通过Rails初始化程序gem_ext.rb混合到gem中。

我试过了:

a) I18n.send :include, GemExt::I18n

b) I18n.send :include, GemExt::I18nExt

c) I18n.module_eval { include ::GemExt::I18n }

d) I18n.module_eval { include ::GemExt::I18nExt }

但是在重新启动Rails控制台后,它不会在I18n.translate(" key")上引发此异常,但会显示原始行为,并且新声明的方法会引发NoMethodError。

2 个答案:

答案 0 :(得分:2)

如果你想monkeypatch I18n.translate方法只需写入/lib/gem_ext/i18n.rb就不需要了 GemExt模块。

module I18n
 def self.translate(*args)
   raise 'ok'
 end
end

答案 1 :(得分:0)

<强>配置/初始化/ gem_ext.rb

Dir[Rails.root.join("lib/gem_ext/**/*.rb")].each {|f| require f}

<强> LIB / gem_ext / i18n.rb

module GemExt::I18n
  extend ActiveSupport::Concern

  included do
    class << self
      def translate(*args)
        raise 'ok'
      end
    end
  end
end

I18n.send(:include, ::GemExt::I18n)