person = Person.find(4123)
person.destroy #=> false
我必须用什么方法来找出为什么没有删除该记录?该模型有两个验证,都只在创建时触发.它有一个回调,但如果失败,回调不会阻塞.
我没有回溯或错误可以查看.
person = Person.find(4123)
person.destroy #=> false
我必须用什么方法来找出为什么没有删除该记录?该模型有两个验证,都只在创建时触发.它有一个回调,但如果失败,回调不会阻塞.
我没有回溯或错误可以查看.
Update:请参阅Mike Slate的答案,以获得更快的解决方案:https://stackoverflow.com/a/53872915/171183.
我遇到了同样的问题,以下是我为弄清发生了什么而做的事情...
(TL;DR:底部给出了完整的代码 list .)
首先,对于我试图 destruct 的对象类,我运行了以下命令,以确定所有关联都设置为dependent: :destroy
:
ary =
<MyClass>.reflect_on_all_associations.select { |a|
a.options[:dependent] == :destroy
}.map(&:name)
然后我在我的对象上调用了ary
中命名的每个关联,并收集了结果.这将关联名称限制为仅具有依赖对象的名称:
ary.select! { |association_name|
<my_object>.send(association_name).present?
}
然后,我可以try 销毁这些关联名称返回的每个对象,以找到问题对象:
associated_objects =
ary.each_with_object([]) { |association_name, acc|
acc.concat(<my_object>.send(association_name))
}
problem_objects =
associated_objects.select { |obj| obj.destroy; obj.errors.any? }
# ...
然后,我可以查看每个问题对象上的错误:
problem_objects.map(&:errors)
这就是我最终看到导致销毁失败的错误的地方.从那时起,解决这个问题只需简单的编程(SMOP).
在我的例子中,有一个before_destroy
回调函数阻止destroy处理我的一个依赖对象关联.为了使以后的调试更简单,我决定在失败的回调上开始在Rails日志(log)中记录一个错误(除了将错误消息添加到errors.base
).
my_object = <your_object_here>
ary =
my_object.class.reflect_on_all_associations.select { |a|
a.options[:dependent] == :destroy
}.map(&:name)
ary.select! { |association_name| my_object.send(association_name).present? }
associated_objects =
ary.flat_map { |association_name| my_object.send(association_name) }
problem_objects =
associated_objects.select { |obj| obj.destroy; obj.errors.any? }
problem_objects.map(&:errors)