我正在为我的rails应用程序编写助手,它应该使用string进行一些操作,当我发现这个时。如果我在转义之后使用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应该怎么做呢?

最佳答案

你正在制作一个很棒的功能;试试这个:

# ...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代码中得到了修复,但如果不是这样,您最好现在就提交bug报告;这种gsub!行为有很好的文档记录,应该保留下来。

关于ruby-on-rails - html_escape的奇怪行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9345366/

10-13 04:49