我遇到了这个问题,最后我使用了Ben Lee给出的解决方案:
验证与模型的错误消息相关联
本 说:
您可以根据内置验证器的代码编写自己的自定义验证器。
查找 validates_associated 的源代码,我们看到它使用了“AssociatedValidator”。源代码是:
module ActiveRecord
module Validations
class AssociatedValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
return if (value.is_a?(Array) ? value : [value]).collect{ |r| r.nil? || r.valid? }.all?
record.errors.add(attribute, :invalid, options.merge(:value => value))
end
end
module ClassMethods
def validates_associated(*attr_names)
validates_with AssociatedValidator, _merge_attributes(attr_names)
end
end
end
end
因此,您可以以此为例来创建一个自定义验证器,该验证器会像这样冒泡错误消息:
module ActiveRecord
module Validations
class AssociatedBubblingValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
(value.is_a?(Array) ? 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
您可以将此代码放在初始化程序中,例如/initializers/associated_bubbling_validator.rb
.
最后,您将像这样进行验证:
class User < ActiveRecord::Base
validates_associated_bubbling :account
end
注意:上面的代码完全未经测试,但如果它不能完全工作,希望它足以让你走上正确的轨道