我想显示来自 Child 模型的验证消息,它给了我基本的 Child 无效。我尝试了所有的解决方案,但没有成功。简而言之,模型如下:
Class Parent
...
has_many :children, dependent: :destroy, inverse_of: :parent
accepts_nested_attributes_for :children, allow_destroy: true
end
Class Child
belongs_to :parent
validate :something
def something
check = # Here I check something
if check < 5
errors[:base] << "validation on children failed"
end
end
end
Run Code Online (Sandbox Code Playgroud)
如果我添加validates_associated :children到 Parent 模型,那么我实际上会收到两条Children is invalid消息,这有点奇怪。
无论如何,我可以将此块添加到 Parent 模型并获取我想要添加到 Parent :base 错误列表中的任何验证消息:
validate do |parent|
parent.children.each do |child|
check = # Here I check something
if check < 5 …Run Code Online (Sandbox Code Playgroud) 我使用模型中的validates_associated来使用其他模型的验证代码.这个问题是验证失败的消息是"..无效".
我想将模型验证失败的实际描述性错误冒出来!
我发现了这个问题: 与模型的错误消息相关的验证
哪个看起来像一个非常接近的解决方案:
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
Run Code Online (Sandbox Code Playgroud)
但实际上它遇到了一个错误:
undefined method `valid?' for #<TicketType::ActiveRecord_Associations_CollectionProxy:0x007ff86474a478>
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮助完成这个几乎工作的工作!?
完整的错误跟踪是:
undefined method `valid?' for #<TicketType::ActiveRecord_Associations_CollectionProxy:0x007ff8646ba148>
Extracted source (around line #6):
4
5
6
7
8
9
def validate_each(record, attribute, value)
(value.is_a?(Array) ? …Run Code Online (Sandbox Code Playgroud)