Rails 5 exists?传ActiveRecord实例弃用警告导致save回滚问题排查
问题原因
弃用警告来源
你控制器第35行的@assignment.save操作会自动触发Assignment模型的验证、关联回调逻辑,警告并不是控制器直接调用exists?产生的,而是来自你Assignment模型内部的验证代码。
回滚原因
事务回滚是因为模型验证未通过,当前日志没有输出验证错误信息,所以看不到具体失败原因。
修复步骤
- 先定位验证失败的具体原因
在你当前的pry断点中依次执行以下命令,即可打印出完整的验证失败原因:
# 触发验证 @assignment.valid? # 输出所有错误信息 puts @assignment.errors.full_messages
常见的失败原因包括:必填字段为空、关联记录不存在、唯一性校验不通过等,比如你当前的@assignment实例中volunteer_shift_id为nil,如果模型设置了该字段/关联必填,就会直接触发验证失败。
- 修复弃用警告
打开app/models/assignment.rb文件,查找以下几类代码进行修改:
- 如果存在自定义验证中调用
exists?时传入了ActiveRecord对象,改为传入对象id:
# 错误写法 if Contact.exists?(self.contact) # 修正写法 if Contact.exists?(self.contact_id)
- 如果存在关联的唯一性验证写为校验关联对象,改为校验关联id:
# 错误写法(会触发弃用警告) validates :contact, uniqueness: { scope: :start_time } # 修正写法 validates :contact_id, uniqueness: { scope: :start_time }
- 额外关联逻辑排查
你的请求参数中包含volunteer_task_type_id、roster_id、program_id几个不属于Assignment的参数,结合你代码里注释的「尝试在这里加create_shift代码」,大概率你漏了前置创建关联的VolunteerShift记录的步骤,没有给Assignment赋值volunteer_shift_id导致验证失败。
内容的提问来源于stack exchange,提问作者thefonso
相关产品推荐
相关产品推荐

