为什么Rails 2中的HTML编码撇号会产生意外结果?

时间:2011-02-04 14:57:06

标签: html ruby-on-rails ruby encode apostrophe

我正在使用h对Rails 2中的某些文本进行HTML编码,但我遇到了撇号问题。更确切地说,我发现我的撇号最终为',这显然不希望我显示。

任何人都有任何想法为什么会这样?我的研究暗示HTML编码不应该影响撇号。

4 个答案:

答案 0 :(得分:4)

这是一个有趣的问题。我发现h AKA html_escape处理撇号AKA "'"的方式不一致。

根据ERB::Util 2.6.6的RDoc:

ESCAPE_TABLE = { '&'=>'&amp;', '<'=>'&lt;', '>'=>'&gt;', '"'=>'&quot;', "'"=>'&#039;', }

gem list erubis
*** LOCAL GEMS ***
erubis (2.6.6)

在IRB中,我看到:

Welcome to IRB. You are using ruby 1.9.2p136 (2010-12-25 revision 30365) [x86_64-darwin10.5.0]. Have fun ;)
>> require 'erb' #=> true
>> ERB::Util.html_escape("foo'bar") #=> "foo'bar"
>> ERB::Util.html_escape('foo"bar') #=> "foo&quot;bar"

编辑:

嘿,这是h方法中的一个错误,或者至少是一个不一致的错误。这是来源:

# File 'lib/erubis/helpers/rails_helper.rb', line 342

def h(value)
  value.to_s.gsub(/[&<>"]/) {|s| ESCAPE_TABLE[s] }
end

请注意,传递给gsub的字符串不包含"'"?这意味着不会为单引号/撇号调用ESCAPE_TABLE的查找。

而且,我们都知道饼干的关键是撇号。 : - )

我希望如果我在您的Rails版本中查看hhtml_escape的定义,我们会发现该字符串中包含撇号。

修复方法是升级您的ERB / Erubis,或覆盖h / html_escape定义是正确的。您可以使用上面的定义作为起点。

答案 1 :(得分:3)

我在Rails 4中遇到了类似的问题,其中撇号显示为&#39; 问题实际上似乎是我使用truncate函数来显示文本。删除后,撇号会按预期显示。

在这种情况下,添加escape:false作为截断选项可以解决问题。

答案 2 :(得分:1)

Ruby on Rails 3会自动h。这不再需要了。使用

<%= @post.body %>

而不是

<%=h @post.body %>

如果您确实要输出任何内容而不转义它,请使用raw

<%=raw @post.body %> <!-- For example, for use in a plaintext format */

答案 3 :(得分:1)

从查看actionpack/lib/action_view/erb/util.rb撇号中的源代码未编码,只有& > < "个字符。

我的猜测是你的Rails应用程序中某个库/插件/ gem已重新定义html_escapeHTML_ESCAPE常量。您还应该直接在数据库中检查数据,以确保在保存时尚未对其进行编码。