12

我遇到了rails自动转义的问题。它目前认为一个字符串是 html_safe (它是),但出于显示目的,我仍然需要它来转义 html。这是字符串正在采取的步骤。

my_string = render(:partial => "set_string", :locals => {:item => @item})
<%= my_string %>

部分基本上是

<h2>Page Header</h2>
<strong><%= item.name %></strong>
<%= item.body %>
etc

我的理解是,因为我直接在视图中显示文本(h2 等),所以它假定它是安全的,并且它也正确地转义了项目输出,这使得整个 my_string 安全。所以,当我尝试用

<%= my_string %>

它不会转义剩余的 html。我尝试添加 h 来强制转义,但这没有用。

所以我的问题是,除了在字符串上调用会使其不安全的东西之外,是否有强制 html 转义安全字符串的方法?

非常感谢你的帮助。

4

3 回答 3

23

在 Rails 3+ 中逃离 ActiveSupport::SafeBuffer

在这种情况下<%= my_string.to_str %>,将根据需要进行双重转义。

安全缓冲工作

当一个字符串被 Rails 转义时,你会得到一个ActiveSupport::SafeBuffer. 从那时起,将跳过额外的转义,因为SafeBufferis html_safe?。这是一个聪明的解决方案!但是,有时我们希望摆脱这种聪明。

为什么要双逃?

我需要重新转义标签助手生成的内容,以将生成的标记传递给data-属性。这对于显示模板生成的代码也很方便。

强制String逃生html_safe?

调用to_strSafeBuffer它返回一个String

# Example html safe content
content = content_tag :code, 'codez<>'
content.html_safe? # true

# call .to_str
escaped = content.to_str
escaped.html_safe? # false

# The escaped String will now be re-escaped when used in a template

to_s问题_

to_s方法看起来非常像该to_str方法。此处不要使用to_sActionView::SafeBuffer#to_s只需返回self,在上下文to_str上方调用where SafeBuffer,自然返回一个 unsafe String

于 2012-12-21T00:54:12.510 回答
11

感谢 Sebastien 的建议,我想在这里得到真正的答案,而不是埋在评论中:

我看起来像这样工作:

<%= raw CGI::escapeHTML(my_string) %>

您需要“原始”调用,否则除了转义之外,escapeHTML 会使字符串不安全,因此自动转义双重转义它。

于 2012-06-10T12:55:41.497 回答
5

要解释 html(这是我理解你需要的),你必须使用:

<%= raw my_string %>
于 2012-06-06T09:30:17.557 回答