是否可以自定义 rails 中的现有错误/异常?

Is it possible to customise a existing error/exception in rails?

提问人:Akhil S R 提问时间:8/30/2022 最后编辑:Dave NewtonAkhil S R 更新时间:8/30/2022 访问量:166

问:

在观察到的情况下,我的控制器捕获了以下错误

#<ActiveRecord::RecordNotUnique: Mysql2:: Error: Duplicate entry 'xyz1' for key 'abc.xyz': INSERT INTO'abc' (<insert statement which is throwing the error>

我想知道是否有办法自定义此异常,以便它还包含现有条目,因此会引发重复错误。

修改现有的标准错误/异常似乎是多余的,但我需要它来避免每个控制器中重复相同的逻辑来处理此错误,以满足上述要求。

更新 1预期输出:

每当抛出以下异常时,都必须将备用错误消息作为异常发送,如下所示。

{Message: "Error caused due to Duplicate entry 'xyz1' for key 'abc.xyz'", existing_abc_with_same_xyz: Abc.find_by(xyz: "xyz1"}

例如重写/重载现有的错误语句。

由于 Abc 是许多其他资源的 Abc ,因此在许多位置都处理此错误......因此,我将不得不在每个位置进行定制,我觉得这是多余的。nested_attribute

Ruby-on-Rails 错误处理 Rubygems Ruby-on-Rails-5

评论


答:

1赞 mechnicov 8/30/2022 #1

您可以使用验证。它在模型中提供人类可读的错误

class Abc < ApplicationRecord
  validates :xyz, uniqueness: true
end

然后在区域设置中自定义消息

也可以使用密钥:message

validates :xyz,
  uniqueness: {
    message: ->(_, data) do 
      "Error caused due to Duplicate entry #{data[:value]} for key 'abc.xyz'. Existing Abc with same xyz: #{Abc.find_by(xyz: data[:value]}"
    end
  }

请看指南

评论

0赞 Akhil S R 8/30/2022
谢谢@mechnicov,是的,我同意,上面的验证肯定会返回一个人类可读的错误。但我的要求是修改错误以包含导致重复的条目
0赞 Akhil S R 8/30/2022
关于“然后在语言环境中自定义消息”..由于 Abc 是许多人nested_attribute,因此在许多地方处理此错误......因此,我将不得不在我觉得多余的每个位置进行定制。所以我在寻找是否有一次性修复的方法。.谢谢
0赞 Les Nightingill 8/30/2022 #2

您将需要使用自定义验证类进行验证。

class User < ApplicationRecord
  validates_with MyUniquenessValidator
end

为了节省时间和精力,您的自定义验证类可以从标准唯一性验证器继承,只需覆盖您需要自定义的部分即可。

# my_uniqueness_validator.rb
class MyUniquenessValidator < ActiveRecord::Validations::Uniqueness
  def validates_each # overwrites standard method
     # in here, copy the standard method, but change the line
     # where it looks for a duplicate to return the id of the duplicate
     # and change the line where it says record.errors.add(...) to include the id of the
     # record that is being duplicated
  end
end

您可以通过在编辑器中打开 activerecord 来找到要研究的标准 ActiveRecord 唯一性验证器:然后导航到“lib/activerecord/validations/uniqueness.rb”。这是在 Rails 7 中可以找到它的地方,在 Rails 5 中也会类似。bundle open activerecord