gpt4 book ai didi

ruby-on-rails - 验证与模型的错误消息关联

转载 作者:行者123 更新时间:2023-12-02 03:41:00 24 4
gpt4 key购买 nike

我有两个模型如下

class User < ActiveRecord::Base
validates_associated :account
end

class Account < ActiveRecord::Base

belongs_to :user

#----------------------------------Validations--Start-------------------------
validates_length_of :unique_url, :within => 2..30 ,:message => "Should be atleast 3 characters long!"
validates_uniqueness_of :unique_url ,:message => "Already Taken"
validates_format_of :unique_url,:with => /^([a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])$/ , :message => " Cannot contain special charaters"
#----------------------------------Validations--End---------------------------
end

现在,当我将帐户与用户关联时,它会显示

"Account is invalid"

相反,我想直接从该模型获取错误消息。所以应该说

“长度至少应为 3 个字符!”“已使用”“不能包含特殊字符”

有办法做到这一点吗?

我不想给出像这样的通用消息:

validates_associated :account , :message=>"one of the three validations failed"

最佳答案

您可以根据内置验证器的代码编写自己的自定义验证器。

查找 validates_linked 的源代码,我们看到它使用“AssociatedValidator”。其源代码是:

module ActiveRecord
module Validations
class AssociatedValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
if Array.wrap(value).reject {|r| r.marked_for_destruction? || r.valid?}.any?
record.errors.add(attribute, :invalid, options.merge(:value => value))
end
end
end

module ClassMethods

def validates_associated(*attr_names)
validates_with AssociatedValidator, _merge_attributes(attr_names)
end
end
end
end

因此,您可以以此为示例来创建一个自定义验证器,该验证器会像这样冒泡错误消息(例如,将此代码添加到 config/initializers/linked_bubbling_validator.rb 中的初始值设定项中):

module ActiveRecord
module Validations
class AssociatedBubblingValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
((value.kind_of?(Enumerable) || value.kind_of?(ActiveRecord::Relation)) ? value : [value]).each do |v|
unless v.valid?
v.errors.full_messages.each do |msg|
record.errors.add(attribute, msg, options.merge(:value => value))
end
end
end
end
end

module ClassMethods
def validates_associated_bubbling(*attr_names)
validates_with AssociatedBubblingValidator, _merge_attributes(attr_names)
end
end
end
end

所以你现在可以像这样验证:

class User < ActiveRecord::Base
validates_associated_bubbling :account
end

此外,请务必在您的 has_many 关联中添加 validate: false,否则,Rails 将默认验证关联,最终会出现两个错误消息,一种由新的 AssociatedBubblingValidator 给出,另一种由 Rails 给出。

关于ruby-on-rails - 验证与模型的错误消息关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7387459/

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