html_escape的奇怪行为

时间:2012-02-19 00:02:07

标签: ruby-on-rails ruby

我正在为我的rails应用程序编写帮助程序,它应该用字符串进行一些操作,当我找到它时。如果我在转义后完全使用gsub方法,那么这段代码就不会像我想的那样工作(它找不到数字999)。

require 'active_support/core_ext/string'

text = ">999"

text = ERB::Util.html_escape(text)

# text = text.downcase
text.gsub!(/\&gt\;(\d+)/) { "found [#{$1}]" }

puts text

在另一种情况下,如果我取消注释text = text.downcase,即将任何方法应用于字符串,那么一切正常。那么,如果我想在gsub方法之后使用html_escape,我该怎么办?

1 个答案:

答案 0 :(得分:3)

你正在打出一个很棒的功能;试试这个:

# ...as before.
text = ERB::Util.html_escape(text)
puts text.class

text实际上是ActiveSupport::SafeBuffer的一个实例,它可能实现了gsub!方法,占用了一个块,但却得到了一些错误 - 因为它不会导致$1 1}}被设置。

您可以通过以下方式解决此问题:

text = text.to_s.gsub!(...)
text = text.gsub!(...) {|match| "found [#{match}]" }

您可能会发现在ActiveSupport代码的更高版本中修复了此不一致性,但您现在也可以将错误报告归档; gsub!行为已有详细记录,应予以保留。