Ruby on rails 在rails中,除了验证错误之外,我如何找出导致.save()失败的原因?
我有一个ActiveRecord模型,它从Ruby on rails 在rails中,除了验证错误之外,我如何找出导致.save()失败的原因?,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我有一个ActiveRecord模型,它从valid?返回true(and.errors为空),但从save()返回false。如果模型实例有效,如何找出导致保存失败的原因?尝试使用bang版本保存(结尾带有感叹号)并检查结果错误。如果@user.save(例如)返回false,则只需运行此命令即可获取所有错误: @user.errors.full_messages 检查您的所有回拨 我遇到了这样一个问题,在我对模型做了一系列更改后,我使用了“after_validate”方法,但失败了。模型
valid?
返回true
(and.errors为空),但从save()
返回false
。如果模型实例有效,如何找出导致保存失败的原因?尝试使用bang版本保存
(结尾带有感叹号)并检查结果错误。如果@user.save
(例如)返回false
,则只需运行此命令即可获取所有错误:
@user.errors.full_messages
检查您的所有回拨 我遇到了这样一个问题,在我对模型做了一系列更改后,我使用了“after_validate”方法,但失败了。模型是有效的,但“after_validate”返回false,因此如果我使用
model.valid
它会显示true,但如果我保存它,则会显示验证错误(通过after_validate回调传递)。这很奇怪
查看应用程序跟踪,您应该能够看到哪一行代码引发了异常。是的,我通过确保在所有before_*callbacks中返回true来修复此问题,然后它开始工作:)我遇到的问题是忘记了将验证添加到模型中
class ContactGroup < ActiveRecord::Base
validates_presence_of :name
end
class ContactGroup
几周前我遇到了这个问题。某些重构留下了一个before\u save函数始终返回false,这导致保存失败。@Jeff--谢谢,原来有一个:before\u save方法返回false。你怎么知道的?这只是代码检查吗?这是代码检查,并对版本控制进行差异化。保存!只是抛出一个RecordNotSaved(当我打印异常的.message时,我只得到异常类的名称)。有什么地方我应该寻找更详细的信息吗?如果您处于Rails开发模式,它应该用堆栈跟踪打印错误的完整描述。在那里查看任何线索和/或发布在这里。我使用控制台,加载对象(例如,o=object.find#id),然后执行o.save!正如答案所说。它会打印出不保存的原因。仅供参考,调用save
可以引发ActiveRecord::RecordInvalid
(因为它运行验证)或ActiveRecord::RecordNotSaved
,因此这就是您想要挽救的。+1因为这是如何诊断这一基本问题的最不令人满意的答案。保存非验证导致的故障。“最不令人满意”的限定是指Rails,而不是这个答案。正如我在问题中提到的,有效吗?是真的(即没有验证错误)。我已经检查过了。errors也返回了一个空列表(我已经更新了问题以指出这一点)。根据Jeff的评论,问题原来是一个before_save回调返回false。@kdt-这正是我的问题所在。我没有考虑过这一点,因为before_save只是用来设置一个属性,但是因为它将其设置为一个假值,该值被隐式返回,并导致保存失败。好的一面是,我现在可以选择通过添加一行来修复此代码“嘿!那是我的假腿!”#信不信由你,这很重要。并不是说我会那样做确保真实返回值的好方法是true.tap{do_something}
wow,这是一个多么模糊的问题啊。永远不会猜到返回false的回调会停止保存。有人能给我指一下这方面的文件吗?谢谢你指出这一点@安迪