Ruby 使用绑定递归调用ERB会导致输出文本丢失
(注意:我使用的是Ruby的Ruby 使用绑定递归调用ERB会导致输出文本丢失,ruby,binding,erb,templating,Ruby,Binding,Erb,Templating,(注意:我使用的是Ruby的erb,而不是Rails。) 使用当前绑定从另一个ERB模板中解析ERB模板时,调用内部模板之前的外部模板文本将丢失 例如: internal.erb文件内容: inner outer <%= ERB.new(File.read('inner.erb')).result(binding) %> outer outer.erb文件内容: inner outer <%= ERB.new(File.read('inner.erb')).result(
erb
,而不是Rails。)
使用当前绑定从另一个ERB模板中解析ERB模板时,调用内部模板之前的外部模板文本将丢失
例如:
internal.erb
文件内容:
inner
outer
<%= ERB.new(File.read('inner.erb')).result(binding) %>
outer
outer.erb
文件内容:
inner
outer
<%= ERB.new(File.read('inner.erb')).result(binding) %>
outer
/erb测试的输出为:
inner
outer
如图所示,在outer.erb
模板文件中指定的第一个“outer”字符串丢失。
如果我们从outer.ERB中的ERB调用中删除绑定
:
<%= ERB.new(File.read('inner.erb')).result %>
这是虫子吗?您建议如何解决这个问题?我意识到最好限制模板的可用状态,通常我使用ERB#result_with_hash
,但对于子模板,即从另一个模板调用的模板,我认为内部模板继承外部模板的绑定是合理的,因为它已经受到限制。这可以通过使用修复,如下所示:
<%= ERB.new(File.read('inner.erb'), eoutvar: '@inner').result(binding) %>
将outer.erb
的内容更改为:
outer
<%= ERB.new(File.read('inner.erb'), eoutvar: '@inner').result(binding) %>
outer
请注意,如果在构造函数调用中传递未命名的参数,则需要使用命名方法,例如,对于修剪模式:
ERB.new(File.read(erb_filespec), eoutvar: eoutvar, trim_mode: '-')
而不是:
template = ERB.new(File.read(erb_filespec), 0, '-')
这很奇怪。我可以验证此行为,但我不理解缺少的外部
与绑定
的关系。这里没有什么是“绑定的”。。。没有变量在起作用,对吗?我认为问题在于ERB代码在构建实例变量时将处理后的字符串存储在实例变量中,当包含自身上下文的绑定再次传递给ERB以构建内部字符串时,该变量在开始之前初始化为空字符串。因此,需要指定不同的变量。
ERB.new(File.read(erb_filespec), eoutvar: eoutvar, trim_mode: '-')
template = ERB.new(File.read(erb_filespec), 0, '-')