不要在轨道上的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的所有信息都是错误的 – 上面的回顾仅尝试提供解释的本质,即在此链接死亡的情况下。