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
我正在尝试修补一些 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