【问题标题】:Monkey patching scope: Outside function doesn't affect ERB猴子补丁范围:外部功能不影响 ERB
【发布时间】:2015-05-30 00:05:04
【问题描述】:

我正在尝试修补一些 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 内部占据一席之地。有没有办法让我完成这项工作?

【问题讨论】:

  • I18n 是在那种情况下引用 ::I18n 还是一些 Whatever::I18n
  • 我没有在其他任何地方重新定义 I18n。我应该去module ::I18n吗?
  • 值得一试。我不知道module I18n是在什么上下文中执行的。
  • 好的,去::I18n 完全解决了!想把它变成答案吗?很愿意接受。感谢您的帮助!
  • 你去。命名空间中的隐含层次结构可能会令人困惑,并且试图弄清楚为什么它不起作用可能会非常令人沮丧,

标签: ruby-on-rails ruby erb monkeypatching


【解决方案1】:

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

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

module ::I18n
  #...
end

【讨论】:

    猜你喜欢
    • 2011-08-26
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 2016-09-01
    • 2012-09-16
    • 2012-12-18
    • 2020-01-09
    • 1970-01-01
    相关资源
    最近更新 更多