使用 ERB 创建单独的模板

Creating separate templates with ERB

我需要能够使用 ERB 创建不同的模板,而不是按顺序附加它们(假设 .result returns 0)。

例如:

require 'erb'

ERB.new("<% FOO = 'foo' %>\n<% BAR = 'bar' %>").result
ERB.new("<% FOO = 'foo' %>\n<% BAR = 'bar' %>").result

Returns 以下警告:

(erb):1: warning: already initialized constant FOO
(erb):1: warning: previous definition of FOO was here
(erb):2: warning: already initialized constant BAR
(erb):2: warning: previous definition of BAR was here

证明第二个 ERB 附加到第一个,或者这里发生了一些其他恶作剧。我已经尝试了各种带有绑定的路由,但 eout_var 无济于事。

我如何ruby 了解这是两个不同的模板而不是一个整体的两个部分?


鉴于已接受的答案,这将是我人为的问题示例的解决方案:

require 'erb'

class Foo
  def get_binding
    binding
  end
end

class Bar
  def get_binding
    binding
  end
end

ERB.new("<% FOO = 'foo' %>\n<% BAR = 'bar' %>").result(Foo.new.get_binding)
ERB.new("<% FOO = 'foo' %>\n<% BAR = 'bar' %>").result(Bar.new.get_binding)

FOO/BAR 常量存在于 ruby 本身,而不存在于模板中,因此重定义警告。

如果您需要一个常数的不同值,那么它显然不是一个常数。如果值相同 - 那么多个定义就没有意义

同时考虑将 binding 传递给 result,默认情况下它是顶级范围,但可以更改