2012-02-19 96 views
2

我正在为我的rails应用程序编写助手,这应该使用字符串做一些处理,并且当我找到它时。如果我在转义后恰好使用gsub方法,那么此代码不会像我想要的那样工作(它不会找到数字999)。奇怪的行为与html_escape

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,即任何方法适用于字符串,然后一切工作正常。那么,如果我想在html_escape方法后恰好使用gsub,我该怎么办?

回答

3

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

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

text实际上是ActiveSupport::SafeBuffer一个实例,这大概实现了gsub!方法,需要一个块,但得到它在某种程度上错了 - 因为它不$1被设置造成的。

您可以解决此通过的方式之一:

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

你可能会发现这种不一致性固定在的ActiveSupport代码更高版本,否则你还不如现在提交错误报告; gsub!行为是有据可查的,应该保留。