在 ERB 中为 rails 插入 HTML 属性损坏?

interpolating HTML attributes in ERB for rails broken?

我想在 html 标签中插入属性 其值。 如果我只插入这样的值:

<span b="<%= "1 2 3"%>">

有效,导致:

<span b="1 2 3">

如果我尝试像这样插入属性:

<span <%= "b='1 2 3'" %> >

与之前相同的结果不同,我得到:

<span b="'1" 2="" 3&#39;="">

这是怎么回事?描述此行为的文档在哪里?

更新: las 示例中的额外引号显然是由浏览器添加的,而不是 ERB,这让我感到困惑。 ERB 将字符串呈现为 <span b=&quot;1 2 3&quot;>,因此浏览器假定这意味着 <span b="&quot;1" 2="" 3&quot;="">,然后解析实体。

你需要深刻理解使用'和"的区别

' 单引号 - 将不作任何解释

"" 双引号 - 解释后才会输出

为了得到你需要的输出,你可以这样编码

<span <%= 'b="1 2 3"' %> >

这里发生的事情是 HTML escaping. In Rails unless you use raw or String#html_safe 字符串中的实体将被转义,这有助于防止跨站点脚本攻击。

所以如果你这样做:

<span <%= raw "b='1 2 3'" %> >

这将产生预期的输出。但是,如果您创建的 HTML 是高度动态的,则更好的方法是使用 tag 助手。字符串插值往往变得非常冗长且难以阅读。

<%= tag.span(b: "1 2 3") %>

<% end %>

您传递的任何哈希参数都会作为属性添加到标签中。