假设我有下面的字符串

@x = "<a href='#'>Turn me into a link</a>"

在我的视图中,我希望显示一个链接。也就是说,我不希望@x中的所有内容都未转义并显示为字符串。使用有什么区别

<%= raw @x %>
<%= h @x %>
<%= @x.html_safe %>

?


当前回答

区别在于Rails的html_safe()和raw()。Yehuda Katz在这方面有一篇很棒的文章,它可以归结为:

def raw(stringish)

  stringish.to_s.html_safe

end

是的,raw()是html_safe()的包装器,它强制输入String,然后对其调用html_safe()。raw()是模块中的一个助手,而html_safe()是String类上的一个方法,它创建了一个新的ActiveSupport::SafeBuffer实例——其中有一个@dirty标志。

参考“Rails的html_safe vs. raw”。

其他回答

考虑Rails 3:

html_safe实际上“设置字符串”为HTML安全(它比这更复杂一点,但基本上就是这样)。通过这种方式,您可以随意从helper或模型返回HTML安全字符串。

H只能在控制器或视图中使用,因为它来自一个helper。它将强制输出转义。它并没有被弃用,但你很可能不会再使用它:唯一的用法是“恢复”html_safe声明,这很不寻常。

在你的表达式前加上raw实际上等同于调用带有html_safe的to_s链,但是在helper上声明,就像h一样,所以它只能在控制器和视图上使用。

“SafeBuffers and Rails 3.0”很好地解释了SafeBuffers(实现html_safe魔法的类)是如何工作的。

在简单Rails术语中:

H删除HTML标记为数字字符,这样渲染就不会破坏你的HTML

Html_safe在string中设置一个布尔值,以便将字符串视为HTML保存

它将html_safe转换为字符串

区别在于Rails的html_safe()和raw()。Yehuda Katz在这方面有一篇很棒的文章,它可以归结为:

def raw(stringish)

  stringish.to_s.html_safe

end

是的,raw()是html_safe()的包装器,它强制输入String,然后对其调用html_safe()。raw()是模块中的一个助手,而html_safe()是String类上的一个方法,它创建了一个新的ActiveSupport::SafeBuffer实例——其中有一个@dirty标志。

参考“Rails的html_safe vs. raw”。

html_safe : Marks a string as trusted safe. It will be inserted into HTML with no additional escaping performed. "<a>Hello</a>".html_safe #=> "<a>Hello</a>" nil.html_safe #=> NoMethodError: undefined method `html_safe' for nil:NilClass raw : raw is just a wrapper around html_safe. Use raw if there are chances that the string will be nil. raw("<a>Hello</a>") #=> "<a>Hello</a>" raw(nil) #=> "" h alias for html_escape : A utility method for escaping HTML tag characters. Use this method to escape any unsafe content. In Rails 3 and above it is used by default so you don't need to use this method explicitly

最安全的方法是:<%=消毒@x %>

它将避免XSS!