提问人:Akhil S R 提问时间:8/30/2022 最后编辑:Dave NewtonAkhil S R 更新时间:8/30/2022 访问量:166
是否可以自定义 rails 中的现有错误/异常?
Is it possible to customise a existing error/exception in rails?
问:
在观察到的情况下,我的控制器捕获了以下错误
#<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
答:
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
评论