erb中双引号属性值的字符串插值

时间:2015-03-23 22:49:08

标签: ruby-on-rails templates erb template-engine

如何编写双引号属性转义的erb表达式并获得正确的转义行为?

例如,我想要输出的东西:

value="Hello World"

如果should_print_value为真,并假设myvalue = Hello World

修改:注意:myvalue可能包含恶意内容

方法1

如果我尝试类似

的话
<%= "value=\"#{myvalue}\"" if should_print_value %>

erb将转义双引号,导致value=&quotHello和另一个名为World&quot=""的属性

方法2

我提出的最简单的解决方案是:

<% if should_print_value %>
  value="<%= myvalue %>"
<% end %>

但我仍然很好奇是否可以使用方法1的<%= "value=.... %>语法。

2 个答案:

答案 0 :(得分:2)

正如@BroiSatse指出的那样,要么使用:

<%= "value=\"#{myvalue}\"".html_safe if should_print_value %>

或者,我希望在观点中看到:

<%= raw "value=\"#{myvalue}\"" if should_print_value %>

这会将内容标记为安全,但您需要注意myvalue不是恶意的。您可以使用CGI.escape之类的方法正确格式化可能存在安全风险的特殊字符。

答案 1 :(得分:1)

如果您致力于内联解决方案,则<input ...value="<%= myvalue if should_print_value %>">应插入正确转义的myvalue或空字符串(有效地告知输入为空),具体取决于should_print_value。我可能只是选择你的方法2,因为我觉得它更清晰。