Ruby模板:是否可能仅将一些值传递给模板中的变量?

时间:2018-07-24 11:45:53

标签: ruby erb

我正在学习ruby模板,并查看ruby文档提供的示例。

require 'erb'
x = 42
template = ERB.new <<-EOF
   The value of x is: <%= x %>
EOF
puts template.result(binding)

当我通过执行以下操作更改示例时:

require 'erb'
x = 42
template = ERB.new <<-EOF
   The value of x is: <%= x %>
   The value of y is <%= y %>
EOF
puts template.result(binding)

我希望模板会变成这样:

The value of x is: 42
The value of y is <%= y %>

它给了我错误:

  

错误:main:Object(NameError)的未定义局部变量或方法“ y”

看起来我们需要传递模板中所有变量替换的所有值。

问题: 我只是想知道是否可以在模板中进行两个变量替换,但在绑定数据时仅将一个值传递给模板?

1 个答案:

答案 0 :(得分:2)

您可以使用两次打开%%来防止在erb中对其进行评估。

此解决方案可能看起来很丑陋,但它会准确返回您想要的内容(如果您想要的话):

require 'erb'

template = ERB.new <<-EOF
  The value of x is: <% if defined?(x) %><%= x %><% else %><%%= x %><% end %>
  The value of y is: <% if defined?(y) %><%= y %><% else %><%%= y %><% end %>
EOF
 => #<ERB:0x00007feeec80c428 @safe_level=nil, @src="#coding:UTF-8\n_erbout = +''; _erbout.<<(-\"  The value of x is: \");  if defined?(x) ; _erbout.<<(( x ).to_s);  else ; _erbout.<<(-\"<%= x %>\");  end ; _erbout.<<(-\"\\n  The value of y is: \"\n);  if defined?(y) ; _erbout.<<(( y ).to_s);  else ; _erbout.<<(-\"<%= y %>\");  end ; _erbout.<<(-\"\\n\"\n); _erbout", @encoding=#<Encoding:UTF-8>, @frozen_string=nil, @filename=nil, @lineno=0> 

puts template.result(binding)
  The value of x is: <%= x %>
  The value of y is: <%= y %>
 => nil 

x = 20

puts template.result(binding)
  The value of x is: 20
  The value of y is: <%= y %>
 => nil 

y= 50

puts template.result(binding)
  The value of x is: 20
  The value of y is: 50
 => nil 

我认为您可以进行格式化。