原始与html_safe与h到unescape html
假设我有以下string
@x = "<a href='#'>Turn me into a link</a>" 在我看来,我想要显示一个链接。 也就是说,我不希望@x中的所有内容都被转义并显示为一个string。 有什么区别使用
 <%= raw @x %> <%= h @x %> <%= @x.html_safe %> 
?
考虑到Rails 3:
  html_safe实际上“设置string”为HTML安全(这比这更复杂一点,但基本上是这样)。 这样,您可以随意从助手或模型返回HTML安全string。 
  h只能从控制器或视图中使用,因为它来自助手。 这将迫使输出逃脱。 这不是真的废弃,但你很可能不会再使用它:唯一的用法是“恢复”一个html_safe声明,很不寻常。 
 用raw加上你的expression式实际上相当于调用to_s链接上的html_safe ,但是在helper上声明,就像h一样,所以它只能用在控制器和视图上。 
  “ SafeBuffers和Rails 3.0 ”是SafeBuffer ( html_safe魔术类)如何工作的一个很好的解释。 
 我认为这是重复的: html_safe不HTML转义您的string。 事实上,它会阻止你的string被转义。 
 <%= "<script>alert('Hello!')</script>" %> 
会把:
 <script>alert('Hello!')</script> 
到你的HTML源代码(耶,太安全了!),而:
 <%= "<script>alert('Hello!')</script>".html_safe %> 
 会popup警告对话框(你确定这是你想要的?)。 所以你可能不想在任何用户input的string上调用html_safe 。 
 区别在于Rails的html_safe()和raw() 。 耶胡达·卡茨(Yehuda Katz)在这方面有一个出色的post,这真的归结为: 
 def raw(stringish) stringish.to_s.html_safe end 
 是的, raw()是html_safe()一个包装器,强制input为String,然后调用html_safe() 。  raw()是模块中的helper也是这样,而html_safe()是String类中的一个方法,它创build了一个新的ActiveSupport :: SafeBuffer实例 – 它有一个@dirty标志。 
参考“ Rails的html_safe与原始 ”。
- 
html_safe:将string标记为可信任的安全。 它将被插入到HTML中,不会执行额外的转义。 "<a>Hello</a>".html_safe #=> "<a>Hello</a>" nil.html_safe #=> NoMethodError: undefined method `html_safe' for nil:NilClass
- 
raw:raw只是html_safe一个包装。 使用raw如果有机会,string将是nil。raw("<a>Hello</a>") #=> "<a>Hello</a>" raw(nil) #=> ""
- 
h别名为html_escape:用于转义HTML标记字符的实用方法。 使用此方法来转义任何不安全的内容。 在Rails 3及以上版本中默认使用它,所以你不需要明确地使用这个方法 
在简单的Rails的条款:
  h将html标签移入数字字符,以便渲染不会破坏您的html 
  html_safe在string中设置一个布尔值,这样string被认为是html保存 
  raw它转换为html_safestring 
 最安全的方法是: <%= sanitize @x %> 
这将避免XSS!