Monkey 修补范围:外部函数不影响 ERB

Monkey patching scope: Outside function doesn't affect ERB

我正在尝试修补一些 I18n 方法来测试正确的转义。在测试中这样做,它是这样的:

test "JS files should be using correct escaping" do
  module I18n
    def self.t(*args)
      %q{a JS interpolation ' " test}
    end
  end
  filename = Rails.root + "app/assets/some_file.js.erb"
  erb = ERB.new(File.read(filename))
  result = erb.run
end

此时,some_file.js.erb 中的所有 I18n.t 调用确实被替换了...但是使用来自 I18n 文件的 正确 值,而不是a JS interpolation ' " test.

换句话说,猴子补丁并没有在 ERB 内部占据一席之地。有没有办法让我完成这项工作?

我猜你的module I18n实际上并没有打开::I18n,这可能是在意外的上下文中执行的,所以你实际上是在为一些[打开SomethingUnexpected::I18n模块=14=] 这是测试框架的一部分。

最简单的解决方法是明确声明您想在顶级命名空间中工作:

module ::I18n
  #...
end