在辅助方法中我有这个:
content_for(:title, raw(page_title))
在我看来,我在调用辅助方法后得到了这个:
<%= h(content_for(:title)) %>
但是当我这样做时,h()不会HTML转义内容?我还试过content_for(:title).html_safe
和html_escape(content_for(:title))
但没有成功。
我将内容保存为原始内容,因为我想在单独的视图中访问原始(未转义的)内容。 我在Rails 3.0.17上。
答案 0 :(得分: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
现在,当视图调用helper方法时,会发生以下情况:
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
只是在字符串/ SafeBuffer上设置html_safe
属性。仅在string.html_safe?
返回false
的字符串上执行转义。由于字符串在每次转义时都返回true
,因此字符串永远不会被转义。
解决:强>
通过插值或连接创建一个新字符串 - 这将再次将html_safe设置为false,并且字符串将被转义。
有关详情,请查看SafeBuffers上的本指南并阅读docs。