2010-10-14 31 views
44

rails 3似乎逃避一切,包括html。我曾尝试使用raw(),但它仍然转义html。有没有解决方法?这是我的帮助,我现在用(/helpers/application_helper.rb):不要在轨道上的ruby中转义html

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)) %> 

回答

80

您可以使用.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

谢谢!我在发布问题后发现了一种解决方法,但这更加优雅和简单。 – alexy13 2010-10-14 11:30:14

+10

杰出的答案。尽管有15分钟的教程,但我总是惊讶于Rails中一些最琐碎的任务有多困难。推土机一切都很好,但有时候你需要的是一个虾叉。 :) – 2012-07-03 22:23:44

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:当你添加一个字符串到SafeBuffer(通过调用+或< <),其他字符串在被附加到SafeBuffer之前被HTML转义。将另一个SafeBuffer附加到SafeBuffer时,不会发生转义。 Rails使用SafeBuffers渲染所有视图,因此上面更新的方法最终为Rails提供了一个SafeBuffer,我们控制它在long_message“按需”而不是“always”执行转义。

现在,这个答案的功劳完全归功于Henning Koch,并在Everything you know about html_safe is wrong详细解释 - 我上面的回顾只是试图提供这个链接永远消亡的解释的本质。

+0

这没什么意义,因为它会在'long_message1'和'long_message2'中转义* all * HTML。提问者似乎想要允许一些HTML。他可以通过在字符串上调用'.html_safe'来做到这一点,但显然他只能这样做,如果他可以信任字符串。你提出的建议不会允许任何HTML,它将全部逃脱。如果我错了,请纠正我。 – Mischa 2017-02-08 16:29:00

+0

@Mischa这不会逃避'long_message1'和'long_message2'中的所有HTML - 这就是整个观点。 :-) SafeBuffer的连接行为只会在内容不安全的情况下转义。在我的回答中,我用'&'包含了一个例子,它正确*不*转义,并显示为&&(不是'&')。另外,如果您对更多示例和细节感兴趣,请注意Henning Koch的完整解释链接。 – DreadPirateShawn 2017-02-08 17:29:31

+0

谢谢。我想我必须深入了解SafeBuffer。我想知道它是如何确定什么是安全的,什么不是。例如,如果提问者想在他的消息中有一个链接呢?它会允许你的实现吗? – Mischa 2017-02-08 17:49:32