我们说我输出了一个帖子标题,在我们的数据库中,Hello Y’all
- 我可以在不使用.html_safe
的情况下输出它,但在这样的情况下它不能以Hello Y’all
的形式输出html的方式吗?
也就是说,如果用户从使用印刷正确的撇号的文字处理器复制帖子标题,我会得到乱码输出,因为它将数据库中的&
转义为{{{ 1}}。当然,我希望数据库中&
的标题输出为Bonnie & Clyde
,因为这是正确的HTML ...
有没有一种安全的方法可以做到这一点?
答案 0 :(得分:10)
使用ActionView::Helpers::SanitizeHelper
<%= "Hello Y’all" %>
<%= sanitize "Hello Y’all" %>
将产生:
Hello Y’all
Hello Y’all
答案 1 :(得分:1)
SafeBuffer calls ERB::Util.h
for strings that aren't html_safe
,因此您可以在gsub
上ERB::Util.h(your_string)
,并在首次在数据库中保存字符串时将&[code]
的实例替换为&[code];
。这样你的字符串首先被消毒
您需要的电话是ERB::Util.h(your_string).gsub(/&(#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&#8217;all" %>
或<%== "Y&#8217;all" %>
是两种可能性。