Rails gsub 的坑 (SafeBuffer 相关)

代码一

s = "[a1111][b22222][v4321342]"
s.gsub(/\[\w(\d+)\]/) do 
  $1
end

结果

=> "1111222224321342"

代码二

s = ERB::Util.html_escape("[a1111][b22222][v4321342]")
s.gsub(/\[\w(\d+)\]/) do 
  $1
end

结果

=> "432134243213424321342"

怎么样,很不一样哈

一开始想 html_escape 就是转换几个字符,怎么会出现这样的情况,仔细查看之后 发现 html_escape 返回的是 SafeBuffer 对象,就是这个 SafeBuffer 导致的这个问题, 使用 to_s 还不行,原来 SafeBuffer 重写了 to_s

def to_s
  self
end

好吧,就用 to_str 吧

s = ERB::Util.html_escape(“[a1111][b22222][v4321342]“).to_str s.gsub(/[\w(\d+)]/) do $1 end

SafeBuffer 为什么会这样呢? 在 Rails 的 bug,还是 feature

This entry was posted in ruby on rails and tagged , , . Bookmark the permalink.

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>