@x = "<a href='#'>Turn me into a link</a>"
在我看来,我想显示一个链接。也就是说,我不希望将@x中的所有内容都转义并显示为字符串。使用
<%= raw @x %>
<%= h @x %>
<%= @x.html_safe %>
有什么区别?
#1 楼
考虑到Rails 3:html_safe
实际上将“字符串设置”为HTML Safe(比这稍微复杂一点,但基本上就是它)。这样,您可以随意从助手或模型返回HTML安全字符串。h
只能在控制器或视图中使用,因为它来自助手。它将迫使输出转义。它并不是真的不推荐使用,但是您很可能不再使用它:唯一的用法是“还原”一个html_safe
声明,这很不寻常。在表达式中加上
raw
实际上等效于调用to_s
与html_safe
链接在一起,但是像h
一样在辅助程序上声明,因此只能在控制器和视图上使用。“ SafeBuffers and Rails 3.0”很好地解释了
SafeBuffer
s(执行html_safe
魔术的类)工作。 评论
我不会说h会被弃用。使用“ Hi
#{h @ user.name}”。html_safe非常普遍,也是公认的用法。
– Maletor
2011年7月19日在23:21
@Maletor有趣的用法,尽管我仍然认为它属于“不寻常”类别。
–法比奥·巴蒂斯塔(FábioBatista)
2011年7月20日14:52
String#html_safe实际上返回ActiveSupport :: SafeBuffer的实例,该实例包装原始字符串,并且是#html_safe? 。原始字符串不会变成#html_safe?在调用#html_safe之后。
– jmaxyz
2012年4月13日15:57
请注意,实践中raw和html_safe之间有细微的差别:raw(nil)返回一个空字符串,而nil.html_safe引发异常。
–范德霍恩
13年8月12日在9:11
h不会“还原” html_safe声明。当字符串为html_safe时,h将不执行任何操作。
–GuiGS
2014年5月26日23:30
#2 楼
我认为这值得重复:html_safe
不会HTML逸出您的字串。实际上,它可以防止您的字符串被转义。<%= "<script>alert('Hello!')</script>" %>
将放置:
<script>alert('Hello!')</script>
放入您的HTML源代码(是的,很安全!),而:
<%= "<script>alert('Hello!')</script>".html_safe %>
会弹出警报对话框(您确定这就是您想要的吗?)。因此,您可能不想在任何用户输入的字符串上调用
html_safe
。评论
换句话说,html_safe不是“请确保此html安全”,相反,它是程序员告诉Rails“此字符串对html安全,保证!”。
– PaulMurrayCbr
2014年1月10日下午4:50
实际上,我来这里是为了弄清它是否确实可以转义,或者是否只是标记出不必转义。完全不同。哦,好了,然后阅读源代码。
–西蒙B.
15年3月31日在12:15
“ html_safe”的概念只是字符串上的一个元标记。将某些内容标记为html_safe既不能转义也不能转义。虽然将某些内容标记为HTML不安全,然后使用ERB <%=标记的隐式转义的最终结果,可能与对数据进行转义然后在输出中重新转义的功能相同,从功能上讲,它们都没有这样做。有点像(6 * -1 * -1)与6。
– Ben Zittlau
19年8月22日在18:23
#3 楼
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”。
#4 楼
html_safe
:将字符串标记为受信任的安全。它将插入到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
,请使用nil
。raw("<a>Hello</a>")
#=> "<a>Hello</a>"
raw(nil)
#=> ""
h
html_escape
的别名:一种实用程序方法用于转义HTML标记字符。使用此方法可以转义任何不安全的内容。
在Rails 3及更高版本中默认使用此方法,因此您无需显式使用此方法
#5 楼
最好的安全方法是:<%= sanitize @x %>
将避免使用XSS!
#6 楼
用Simple Rails术语:h
将html标签删除为数字字符,以便呈现不会破坏html html_safe
在字符串中设置布尔值,以便将该字符串视为html save raw
它将html_safe转换为字符串评论
h是html_safe,这表示HTML照原样呈现。
–戴夫·牛顿
18年1月9日在22:24
答案是正确的:h是html_escape ...从Rails代码库
–notapatch
19-10-3在14:29
评论
由于没有人提到它,所以我想我也要提到<%== @x%>这是<%= raw(@x)%> edgeguides.rubyonrails.org / ...的别名。