我运行到与导轨自动转义的问题。 目前,它认为一个字符串是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。 我尝试添加小时,以迫使逃逸,但没有奏效。
所以我的问题是,反正是有强制HTML比调用的字符串,这将使它不安全的东西以外的安全的字符串的逃避?
非常感谢你的帮助。
从的ActiveSupport :: SafeBuffer Rails中逃生3+
在这种情况下<%= my_string.to_str %>
根据需要将双逃逸。
SafeBuffer运作
当一个字符串由Rails的逃脱你得到ActiveSupport::SafeBuffer
。 从这一点来说,额外的转义被跳过,因为SafeBuffer
是html_safe?
。 这是一个聪明的解决方案! 有很多次,虽然,我们希望避免这样的小聪明。
为什么双逃脱呢?
我需要重新越狱按标签助手生成所产生的标记传递给内容 data-
属性。 这也派上用场,用于显示模板生成的代码。
强制逃生的String
这是html_safe?
调用to_str
在SafeBuffer
,它返回一个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_s
这里ActionView::SafeBuffer#to_s
刚刚返回self
,在to_str
被称为以上SafeBuffer
背景下,返回自然不安全的String
。
由于塞巴斯蒂安您的建议,我想来到这里,而不是真正的答案埋在评论:
我是这样工作的:
<%= raw CGI::escapeHTML(my_string) %>
你还需要“原始”的呼叫,否则escapeHTML使得字符串除了逃脱它不安全,因此汽车逃跑双逃脱它。
为了解释HTML(这是我的理解,你需要),你必须使用:
<%= raw my_string %>