直接上代码大家应该就明白了:
p = Post.first
content = p.content # 假设 p.content 的值是 "abc123"
content.gsub!('123', '456')
puts p.content # => 'abc456'
puts p.content_changed? # => false
p.content = content
p.save # => true # 没有出错
p.reload
puts p.content # => 'abc123' # 但是也没有保存成功
我的理解:
content = p.content
这一句之后,content 跟 p.content 指向的是同一块内存gsub!
修改的是原内存位置的内容(不一定要是 gsub!
,像 upcase!
这些方法效果也一样)p.content_changed?
为 true
时 p.save
才会保存新的 content
值。严格来说不能算是 bug,只是一般情况下比较难注意到这种问题 = =