在保留html实体的同时在Rails中使用html_safe?

时间:2012-11-05 18:38:12

标签: ruby-on-rails html-entities actionview

我们说我输出了一个帖子标题,在我们的数据库中,Hello Y’all - 我可以在不使用.html_safe的情况下输出它,但在这样的情况下它不能以Hello Y’all的形式输出html的方式吗?

也就是说,如果用户从使用印刷正确的撇号的文字处理器复制帖子标题,我会得到乱码输出,因为它将数据库中的&转义为{{{ 1}}。当然,我希望数据库中&的标题输出为Bonnie & Clyde,因为这是正确的HTML ...

有没有一种安全的方法可以做到这一点?

4 个答案:

答案 0 :(得分:10)

使用ActionView::Helpers::SanitizeHelper

<%= "Hello Y&#8217;all" %>
<%= sanitize "Hello Y&#8217;all" %>

将产生:

Hello Y&#8217;all
Hello Y’all

答案 1 :(得分:1)

SafeBuffer calls ERB::Util.h for strings that aren't html_safe,因此您可以在gsubERB::Util.h(your_string),并在首次在数据库中保存字符串时将&amp;[code]的实例替换为&[code];。这样你的字符串首先被消毒

您需要的电话是ERB::Util.h(your_string).gsub(/&amp;(#x?[\da-fA-F]+;)/, '&\1')

然后,只要您需要显示该特定字符串,请在其上调用html_safe

答案 2 :(得分:0)

有三种方法可以做到这一点:

1: "string".htmlsafe
2: <%= raw "string" %>
3. <%== "string" %>

我认为你应该使用&lt;%= raw“字符串”%&gt;当它接受参数时,将.to_s应用于它,然后它只是将html_safe应用于它。因此,使用第二种选择是安全的。

答案 3 :(得分:0)

<%= raw "Y&amp;#8217;all" %><%== "Y&amp;#8217;all" %>是两种可能性。