2012-02-19 9 views
2

私はレールアプリのヘルパーを作成していました。私が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が実際におそらく、gsub!メソッドを実装してブロックがかかりますが、それは何らかの形で間違って取得ActiveSupport::SafeBufferのインスタンスです - それは設定されている$1にはなりませんように。

あなたがいずれかの方法でこの問題を回避することができます:あなたはactivesupportのコードの以降のバージョンで修正され、この矛盾を見つけるかもしれないが、それ以外あなたにも今バグレポートを提出かもしれない

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

gsub!の動作は十分に文書化されており、保存する必要があります。