2

我正在使用hHTML 编码 Rails 2 中的一些文本,但我遇到了撇号问题。更准确地说,我发现我的撇号最终'是我不想显示的。

有人知道为什么会这样吗?我的研究暗示 HTML 编码不应该影响撇号。

4

4 回答 4

5

这是个有趣的问题。我看到hAKAhtml_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定义以使其正确。您可以使用上面的定义作为起点。

于 2011-02-04T15:31:34.090 回答
3

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

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

于 2014-05-27T08:40:16.290 回答
1

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

<%= @post.body %>

代替

<%=h @post.body %>

如果您确实想在不转义的情况下输出任何内容,请使用raw

<%=raw @post.body %> <!-- For example, for use in a plaintext format */
于 2011-02-04T14:59:17.990 回答
1

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

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

于 2011-02-04T15:19:02.583 回答