Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 使用绑定递归调用ERB会导致输出文本丢失_Ruby_Binding_Erb_Templating - Fatal编程技术网

Ruby 使用绑定递归调用ERB会导致输出文本丢失

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(

(注意:我使用的是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(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, '-')