2011-02-04 80 views
1

我使用h来对Rails 2中的一些文本进行HTML编码,但是我在使用撇号时遇到了问题。更准确地说,我发现我的撇号最终为',这显然不是我想要显示的。为什么Rails 2中的HTML编码撇号会产生意想不到的结果?

任何人有任何想法,为什么发生这种情况?我的研究暗示HTML编码不应该影响撇号。

+0

它真的输出了''`给用户看到什么(即`'`),或者当查看html时显示? – 2011-02-04 15:05:21

+0

是 - 用户看到' – tiswas 2011-02-07 12:50:32

回答

3

这是一个有趣的问题。我看到h又如何处理撇号AKA "'"如何不一致。

按照RDoc的为ERB::Util 2.6.6:

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

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

<%= @post.body %> 

,而不是

<%=h @post.body %> 

如果你想输出任何东西没有逃脱它,使用raw

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

actionpack/lib/action_view/erb/util.rb撇看源代码不被编码,只有& > < "个字符。

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

3

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

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

相关问题