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



如何编写双引号属性转义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=.... %>语法是否可行。

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

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

或者,我更喜欢的观点:

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

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

如果您致力于内联解决方案,<input ...value="<%= myvalue if should_print_value %>">应该根据should_print_value插入一个正确转义的myvalue或一个空字符串(有效地告诉输入为空)。我可能会选择你的方法2,因为我觉得它稍微清晰一些。