升级Rails 4.2至5.1.0时Rspec测试遇`changed`弃用警告
解决Rails 5.1升级中
changed方法的弃用警告 我之前从Rails 4.x升级到5.1的时候也碰到过一模一样的警告,给你说说怎么搞定它。
首先先理清楚这个警告的核心原因:Rails要调整changed方法在after回调(比如after_save、after_update)里的行为——现在它返回的是「保存前有变更的字段」,但后续版本会改成返回「保存后变更的字段」(相当于现在的相反结果)。为了让你的代码保持当前的逻辑不被新版本影响,官方提示用saved_changes.keys来替代。
具体修改步骤
- 定位到警告里提到的
has_changes?方法(路径是/Users/djohnson/projects/EvantaAccessAPI...里的这个方法),先看看它的原始实现,大概率是这样的:
def has_changes? changed? # 或者 changed.any? end
或者是直接使用changed获取变更字段的逻辑。
- 按照警告提示替换成
saved_changes相关的逻辑:- 如果只是判断是否存在变更,把
changed?替换成saved_changes.present? - 如果是要获取具体的变更字段列表,把
changed替换成saved_changes.keys
- 如果只是判断是否存在变更,把
举个实际的修改例子:
原来的代码:
def has_changes? changed.any? end
修改后:
def has_changes? saved_changes.keys.any? end
额外注意点
saved_changes是Rails 5.1新增的方法,专门用来记录保存操作后实际发生变更的字段和值,正好匹配警告里要求的「维持当前行为」的需求。- 这个方法只能在
after_save、after_update这类保存完成后的回调里使用,在保存前的回调(比如before_save)里用会报错,不过你的警告是出现在after回调里,所以没问题。
改完之后重新跑你的RSpec测试套件,应该就能看到这个弃用警告消失了,同时要确认相关功能的测试用例都能通过,避免因为替换逻辑出现意外问题。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

