【问题标题】:How to escape value returned by a yield如何转义收益返回的值
【发布时间】:2011-05-05 11:53:24
【问题描述】:

我最近遇到了一个问题,要转义模板中的 yield 返回的值。

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

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

这是我的模板,不幸的是,它没有按预期转义值:

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

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

<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 - 谢谢!

【问题讨论】:

  • 嗨,您尝试了 escape_javascript 助手吗?
  • 否,但在此上下文中没有 javascript。

标签: ruby-on-rails escaping yield html


【解决方案1】:

'h' 函数只转义无效的 html。 您的代码的问题是引号不是无效的 html。否则,您的网页中的任何地方都无法引用。 "h" 可以做一些事情,比如把 "

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

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

例如,如果您尝试了以下操作:

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

你最终会得到:

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

更新:

哦,字符串连接能成功的原因是,新版本的 Rails 将 html 安全,它认为是脏字符串......但是,如果您使用一种 Railsy 方式生成元标记。

【讨论】:

  • 另一个使用默认 Rails 助手的理由,并停止将 html 与 ruby​​ 代码混合。谢谢塔林:)
  • 可能不会发生......但是,嘿,我让人们知道 S/O 礼仪是什么,以防万一他们注意。 :)
【解决方案2】:

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

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

这给了你

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

【讨论】:

  • 我总是忘记这个助手,但它非常适合这个。
【解决方案3】:

你可以使用 raw() 方法来做这样的事情:

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

【讨论】:

    猜你喜欢
    • 2016-10-04
    • 2020-04-21
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-11
    • 2014-08-29
    • 2020-10-05
    相关资源
    最近更新 更多