1

在一个辅助方法中,我有这个:

content_for(:title, raw(page_title))

在我看来,我在调用辅助方法后得到了这个:

<%= h(content_for(:title)) %>

但是,当我这样做时, h() 不会 HTML 转义内容吗?我也尝试过content_for(:title).html_safehtml_escape(content_for(:title))但没有成功。

我将内容保存为原始内容,因为我想在单独的视图中访问原始(未转义)内容。我在 Rails 3.0.17 上。

4

1 回答 1

1

经过一番调查,这是我的结论:这都是关于 html_safe 的。

让我用一些代码解释一下:

page_title.html_safe? #false
raw(page_title).html_safe? #true - that's all that raw does
content_for(:title, raw(page_title)) #associates :title with page_title, where page_title.html_safe? returns true

现在,当视图调用辅助方法时,会发生以下情况:

content_for(:title) #no escaping. Since page_title was stored and html_safe is true, conetnt_for will not escape
h(content_for(:title)) #no escaping. Since the last line returned a string where html_safe? returns true, this will also not escape.
<%= h(content_for(:title)) %> #no escaping. Same reason as above

简而言之,raw只需html_safe在字符串/SafeBuffer 上设置属性。string.html_safe?仅对返回的字符串执行转义false。由于字符串true在每次转义机会时都会返回,因此该字符串永远不会被转义。

解析度:

通过插值或连接创建一个新字符串 - 这会将 html_safe 再次设置为 false 并且字符串将被转义。

有关更多信息,请查看有关SafeBuffers的本指南并阅读文档

于 2012-08-29T23:46:47.513 回答