Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在rails中,除了验证错误之外,我如何找出导致.save()失败的原因?_Ruby On Rails_Activerecord - Fatal编程技术网

Ruby on rails 在rails中,除了验证错误之外,我如何找出导致.save()失败的原因?

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”方法,但失败了。模型

我有一个ActiveRecord模型,它从
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的回调会停止保存。有人能给我指一下这方面的文件吗?谢谢你指出这一点@安迪