gpt4 book ai didi

ruby-on-rails - 如何更改关联的验证错误消息?

转载 作者:行者123 更新时间:2023-12-04 19:55:12 25 4
gpt4 key购买 nike

我有一个 Document类,与 has_many :fields .每个 Field 对象都有一个 name属性。

当我验证文档和关联的字段时,对于每个无效的字段关联,我都会收到以下验证错误消息:

Fields is invalid.

这是一个非常无用的错误信息。相反,我希望它说:
Field '<value of the name attribute>' is invalid.

例如:
Field 'subject' is invalid.
Field 'date' is invalid.

我怎样才能做到这一点?

最佳答案

我有同样的问题。到目前为止没有好的答案。
所以我自己通过用详细错误消息替换关联错误消息来解决它:
创建关注文件 app/models/concerns/association_error_detail_concern.rb :

    module AssociationErrorDetailConcern
extend ActiveSupport::Concern

included do
after_validation :replace_association_error_message
end

class_methods do
def association_names
@association_names ||= self.reflect_on_all_associations.map(&:name)
end
end


def replace_association_error_message

# Gets the intersection between this class's associations and the instance's associations that have validation errors
associations_with_errors = self.errors.keys & self.class.association_names

associations_with_errors.each do |association_name|
next unless self.errors[association_name]
self.errors.delete(association_name)
Array.wrap(public_send(association_name)).each do |record|
record.errors.each do |attribute, error|
self.errors.add(:"#{association_name}.#{attribute}", error)
end
end
end
end
end
然后将其包含在您的模型中:
class Shop::Product < ApplicationRecord
include AssociationErrorDetailConcern
...
end
然后我们来谈谈这些属性的翻译。
Rails 将自动采用关联模型翻译中定义的那些:
  activerecord:
attributes:
associated_model_name:
attribute_name: 'Foo'
然而,当在关联的上下文中进行验证时,可能需要使该属性具有不同的转换。而不是仅仅显示 Email is required ,当您验证用户时工作正常,您可能希望显示类似 Poster's e-mail is required 的内容。验证 Post 时那个 belongs_to :user .
考虑到上述问题,由于错误将添加到 key :user.email , Rails 会找到 activerecord.attributes.user.email翻译,但它也会首先在 activerecord.attributes.post/user.email 中查找,像这样:
  activerecord:
attributes:
post/user:
email: 'Foo'
这为您翻译这些属性提供了最大的灵活性,具体取决于验证它们的上下文。
如果您想了解 Rails 如何找到这些键,请查看 translation.rb#human_attribute_name ,您会看到它将在 . 处拆分 key 并使用它来查找 .yml 中的 key 文件。 EDITOR="sublime --wait" bundle open activemodel最后但并非最不重要的一点是,不要忘记 Rails 只会自动验证您的关联,如果它是 has_manyhas_and_belongs_to_many (检查每个关联类型 https://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html 上的 validate 选项)。 belongs_tohas_one有一个默认值 validate: false ,您可以将其更改为 true或使用 validates_associated .
在上面的例子中,因为它是一个帖子 belongs_to :user ,你必须添加一个 validates_associated :user例如,否则用户的验证甚至不会运行。

关于ruby-on-rails - 如何更改关联的验证错误消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20071897/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com