rails 3似乎逃脱了一切,包括html。我尝试过使用raw()但它仍然逃脱了html。有解决方法吗?这是我正在使用的帮手(/helpers/application_helper.rb):
module ApplicationHelper
def good_time(status = true)
res = ""
if status == true
res << "Status is true, with a long message attached..."
else
res << "Status is false, with another long message"
end
end
end
我使用此代码在视图中调用帮助程序:
<%= raw(good_time(true)) %>
答案 0 :(得分:86)
您可以像这样使用.html_safe
:
def good_time(status = true)
if status
"Status is true, with a long message attached...".html_safe
else
"Status is false, with another long message".html_safe
end
end
<%= good_time(true) %>
答案 1 :(得分:3)
我遇到了同样的事情并且发现了比使用html_safe
更安全的解决方案,特别是一旦你引入了动态的字符串。
首先,更新的代码:
def good_time(long_message1, long_message2, status = true)
html = "".html_safe
html << "Status is #{status}, "
if status
html << long_message1
else
html << long_message2
end
html
end
<%= good_time(true) %>
如果内容不安全,则会转义long_message
内容,但如果安全,则将其转义为
这样可以"long message for success & such."
正确显示,但也可以转义"malicious message <script>alert('foo')</script>"
。
解释归结为这一点 - 'foo'.html_safe
返回一个ActiveSupport :: SafeBuffer,除了一个以外,它在每个方面都像String一样:当你将一个String附加到一个SafeBuffer时(通过调用+或&lt;&lt; ),其他字符串在被附加到SafeBuffer之前进行HTML转义。当您将另一个SafeBuffer附加到SafeBuffer时,不会发生转义。 Rails使用SafeBuffers渲染您的所有视图,因此上面更新的方法最终为Rails提供了一个我们已经控制的SafeBuffer,可以根据需要执行long_message
&#34;&#34;&#34; 34;而不是&#34;总是&#34;。
现在,这个答案的功劳完全归功于Henning Koch,并且在Everything you know about html_safe is wrong更详细地解释了 - 我的上述回顾只是试图提供解释的本质,因为这个链接曾经模具