Gui*_*ume 6 html yield escaping ruby-on-rails
我最近有一个问题是逃避模板中的yield返回的值.
在我的布局中,我产生了元描述,以便我可以从我的模板中定义它
<meta name="description" content="<%= yield :html_description %>" />
Run Code Online (Sandbox Code Playgroud)
这是我的模板,不幸的是,并没有像预期的那样逃避价值:
<% content_for :html_description, 'hello "you" guy' %>
<meta name="description" content="hello "you" guy" />
Run Code Online (Sandbox Code Playgroud)
我试图用h()escaper逃脱它,但它不起作用:
<meta name="description" content="<%= h(yield :html_description) %>" />
<meta name="description" content="hello "you" guy" />
Run Code Online (Sandbox Code Playgroud)
我也尝试使用escape_once(),但它做得太多了:
<meta name="description" content="<%= escape_once(yield :html_description) %>" />
<meta name="description" content="hello &quot;you&quot; guy" />
Run Code Online (Sandbox Code Playgroud)
但是,通过将返回的值与字符串连接起来,它可以解决问题:
<meta name="description" content="<%= '' + (yield :html_description) %>" />
<meta name="description" content="hello "you" guy" />
Run Code Online (Sandbox Code Playgroud)
有谁理解这种行为?
你有一个比这个串联更好的解决方案,巧合吗?
我正在使用Rails 2.3.8 - 谢谢!
对于meta,img或br等自闭合标记,可以使用"tag"方法.
<%= tag(:meta, :name => 'description', :content => yield(:html_description)) %>
Run Code Online (Sandbox Code Playgroud)
这给了你
<meta content=""I am surrounded by quotes"" name="description" />
Run Code Online (Sandbox Code Playgroud)
'h' 函数仅转义无效的 html。您的代码的问题是引号不是无效的 html。否则,您的网页中的任何位置都无法引用。“h”可以执行诸如将“<script>”转换为“<script>”之类的操作 反而。
所以...*挥手*这不是您正在寻找的方法。
可能会为您解决这个问题的实际上是使用rails方法来创建元标记本身 - 然后rails会很好地为您转义它。
例如,如果您尝试以下操作:
<%= content_tag(:meta, nil, :name => 'description', :content => yield(:html_description)) %>
Run Code Online (Sandbox Code Playgroud)
你最终会得到:
<meta content="hello "you" guy" name="description"></meta>
Run Code Online (Sandbox Code Playgroud)
更新:
哦,字符串连接之所以能解决这个问题,是因为新版本的 Rails 会对它认为脏的字符串进行 html 安全处理……但是,如果您使用生成元标记的railsy方式。
| 归档时间: |
|
| 查看次数: |
1327 次 |
| 最近记录: |