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).

完整的代码 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相关问答推荐

Rails turbo流只更新页面上的一个元素

使用Rails和RSpec,有没有办法查看操作真正将您带到哪个页面?

是否可以使用 Turbo 帧更新 Rails 表单输入字段值?

获取所有属于模型的嵌套对象

为什么 Rails 执行器不能识别内核的改进?

在 Rails 7 中,可以将导入映射与 js Bundle 解决方案一起使用,还是它们是专有的?

未初始化的常量 ActionDispatch::Session::EncryptedCookieStore (NameError)

Rspec:测试实例变量的赋值

查找日期时间与今天匹配的记录 - Ruby on Rails

SQLite3::BusyException

更改 form_for rails 3.1 生成的 html 表单 ID

如何在where子句中组合两个条件?

Rails - 从日期和时间戳获取日期

activerecord 查找所有未包含在数组中的内容

对象不支持此属性或方法 Rails Windows 64bit

使用 PostgreSQL 的模式和 Rails 创建多租户应用程序

rake db:回滚不起作用?

Vagrant上的Rails 4.2服务器端口转发不起作用

用于在多行上链接调用的 Ruby 约定

rake 任务中的 def 块