如何转义yield返回的值

时间:2010-11-05 08:11:56

标签: ruby-on-rails escaping yield html

我最近有一个问题是逃避模板中的yield返回的值。

在我的布局中,我会生成元描述,以便我可以从我的模板中定义它

<meta name="description" content="<%= yield :html_description %>" />

这是我的模板,不幸的是,并没有像预期的那样逃避价值:

<% content_for :html_description, 'hello "you" guy' %>
<meta name="description" content="hello "you" guy" />

我试图用h()escaper来逃避它,但它不起作用:

<meta name="description" content="<%= h(yield :html_description) %>" />
<meta name="description" content="hello "you" guy" />

我也尝试过使用escape_once(),但它做得太多了:

<meta name="description" content="<%= escape_once(yield :html_description) %>" />
<meta name="description" content="hello &amp;quot;you&amp;quot; guy" />

但是,通过将返回的值与字符串连接起来,它可以解决问题:

<meta name="description" content="<%= '' + (yield :html_description) %>" />
<meta name="description" content="hello &quot;you&quot; guy" />

有没有人理解这种行为?

你有一个更好的解决方案,而不是通过巧合来修复它吗?

我正在使用Rails 2.3.8 - 谢谢!

3 个答案:

答案 0 :(得分:6)

对于meta,img或br等自闭标签,您可以使用“tag”方法。

<%= tag(:meta, :name => 'description', :content => yield(:html_description)) %>

这会给你

<meta content="&quot;I am surrounded by quotes&quot;" name="description" />

答案 1 :(得分:4)

'h'函数只能转义无效的html。 你的代码的问题是引号不是无效的html。否则,您的网页中的任何地方都无法使用引号。 “h”可以执行诸如转换“&lt; script&gt;”之类的操作进入“&amp; lt; script&amp; gt;”代替。

所以...... * 挥手 *这不是您要寻找的方法。

可能为您解决的问题实际上是使用rails方法创建元标记本身 - 然后rails会很好地为您解决它。

例如,如果你尝试了以下内容:

<%= content_tag(:meta, nil, :name => 'description', :content => yield(:html_description)) %>

你最终得到:

<meta content="hello &quot;you&quot; guy" name="description"></meta>

更新

哦,字符串连接的原因是Rails的新版本将html-safe它认为是一个脏字符串...但是,如果它是一个你不需要我们的黑客你使用一种生成元标记的方式。

答案 2 :(得分:0)

您可以使用raw()方法执行以下操作:

<% microdata = "" %>
<% microdata = "itemscope itemtype='#{yield :itemtype}'" if content_for? :itemtype %>
<div class='container' <%= raw(microdata) %> >
</div>