person = Person.find(4123)
person.destroy #=> false
我有什么方法可以找出记录未被删除的原因?该模型有两个验证,都只在创建时触发。它有一个回调,但如果失败,回调不会阻塞。
我没有回溯或错误可以查看。
最佳答案
更新 :请参阅 Mike Slate 的答案以获得更快的解决方案:https://stackoverflow.com/a/53872915/171183 .
我遇到了同样的问题,这是我为弄清楚发生了什么所做的一切......
(TL;DR:底部给出的完整代码 list 。)
首先,对于我试图销毁的对象的类,我运行它以找出所有关联设置为 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?
}
然后我可以尝试销毁这些关联名称返回的每个对象以找到问题对象:
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
回调阻止销毁处理我的依赖对象关联之一。为了使将来更易于调试,我决定开始将错误记录到 Rails 日志中失败的回调(除了将错误消息添加到 errors.base
之外)。完整代码 list :
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)
关于ruby-on-rails - 如何找出我无法 #destroy() 记录的原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16767415/