在rails中,除了验证错误之外,我怎样才能找出导致.save()失败的原因?

kdt*_*kdt 83 activerecord ruby-on-rails

我有一个truevalid?(和.errors为空)返回的ActiveRecord模型,但是false从中返回save().如果模型实例有效,我如何找出导致保存失败的原因?

And*_*man 106

尝试使用爆炸版本save!(末尾带有感叹号)并检查产生的错误.

  • +1快速和肮脏,但这总是我做的 (7认同)
  • 保存!只是抛出RecordNotSaved(当我打印异常的.message时,我只得到异常类的名称).有什么地方我应该寻找更多细节吗? (4认同)
  • 仅供参考,调用 `save!` 可以引发 `ActiveRecord::RecordInvalid`(因为它运行验证)或 `ActiveRecord::RecordNotSaved`,所以这就是你想要拯救的。 (2认同)
  • +1是因为这是对如何诊断不是由验证引起的`.save`故障的基本问题的最不满意的答案。“最不满意”的资格指的是Rails,而不是这个答案。 (2认同)

小智 101

如果@user.save(例如)返回false,则只需运行此命令即可获得所有错误:

@user.errors.full_messages
Run Code Online (Sandbox Code Playgroud)

  • 正如我在问题中提到的,.valid?是真的 - 即没有验证错误.我已经检查过.errors也返回一个空列表(我已经更新了问题以指出这一点) (9认同)

And*_*rew 47

检查所有回调.

我有一个像我这样的问题和"after_validate"方法,在我对模型进行了一系列更改之后失败了.该模型是有效的,但"after_validate"返回false,所以如果我使用model.valid它说true,但如果我保存它给了我验证错误(从after_validate回调传递).这很奇怪.

查看应用程序跟踪,您应该能够看到引发异常的代码行.

  • @kdt - 这正是我的问题所在.我没有想过它因为before_save只是为了设置一个属性,但是因为它将它设置为false值,所以它被隐式返回并且使得save无声地失败.从好的方面来说,我现在可以选择通过添加"嘿!这是我的假腿!"这一行来修复此代码.#信不信由你,这很重要.不是我会这样做.;) (3认同)
  • 根据Jeff的评论,问题原来是一个返回false的before_save回调. (2认同)
  • 确保真正返回值的一个好方法是`true.tap {do_something}` (2认同)