我遇到一个问题与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转义一个安全的字符串,除了调用字符串上的东西,这将使其不安全?
非常感谢你的帮助.
解决方法
从Rails 3中的ActiveSupport :: SafeBuffer中删除
在这种情况下,<%= my_string.to_str%>将根据需要进行双重转义.
SafeBuffer工作
当Rails转义字符串时,您将获得ActiveSupport :: SafeBuffer.从那时起,会跳过额外的转义,因为SafeBuffer是html_safe?这是一个聪明的解决方案!有时候,我们希望逃避这样的聪明才智.
为什么双重逃跑?
我需要重新转义标签助手生成的内容,以将生成的标记传递给数据属性.这也可以用于显示模板生成的代码.
强制转义为html_safe的字符串?
调用SafeBuffer上的to_str,返回一个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 gotcha
to_s方法看起来非常像to_str方法.不要在这里使用to_s,ActionView :: SafeBuffer#to_s只返回自己,在SafeBuffer上下文中调用to_str,返回一个自然不安全的字符串.