不要在轨道上的ruby转义HTML
轨道3似乎逃避一切,包括HTML。 我曾尝试使用原始(),但它仍然转义的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)) %>
你可以像这样使用.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) %>
我遇到了同样的事情,发现比使用html_safe
更安全的解决scheme,尤其是一旦你引入了dynamic的string。
首先,更新的代码:
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(通过调用+或<<),其他string在将其附加到SafeBuffer之前是HTML转义的。 将另一个SafeBuffer附加到SafeBuffer时,不会发生转义。 Rails使用SafeBuffers渲染你的所有视图,所以上面更新的方法最终为Rails提供了一个SafeBuffer,我们已经控制它在long_message
“按需”而不是“always”执行转义。
现在,这个答案完全归功于Henning Koch,并且在更详细的解释中, 您所了解的关于html_safe的所有信息都是错误的 – 上面的回顾仅尝试提供解释的本质,即在此链接死亡的情况下。