【发布时间】:2016-09-09 05:30:10
【问题描述】:
我想显示来自 Child 模型的验证消息,它给了我基本的 Child is invalid 相反。我尝试了所有解决方案,但没有成功。 简而言之,以下是模型:
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
如果我将 validates_associated :children 添加到 Parent 模型,那么我实际上会收到两条 Children is invalid 消息,这有点奇怪。
无论如何,我可以将此块添加到 Parent 模型并获取我想要添加到 Parent 的任何验证消息:基本错误列表:
validate do |parent|
parent.children.each do |child|
check = # Here I check something
if check < 5
errors[:base] << "validation on children failed"
end
end
end
但是,我仍然会在此消息之上收到来自 Child 模型的验证错误消息,因此现在我们将收到 3 条错误消息:“Children is invalidChildren is invalidvalidation on children failed”... 丑陋。
由于我将block添加到Parent模型中,我可以从Child模型中移除validation,从Parent中移除validates_associated :children,然后保存实例不会通过validation,但是属于Child的数据模型将没有验证,并将保存/更新。
希望这一点得到清楚的解释。如果你能提供一个解决方案,那就太棒了!
更新 1:关于accepts_nested_attributes_for
这是非常糟糕的记录。正如我所解释的,我无需请求即可对我的 nsted 模型进行验证。我相信原因是accepts_nested_attributes_for 实际上是从嵌套模型运行验证。
这意味着我从嵌套模型中获得的所有验证消息,无论验证类型如何,都会给我一条消息。我可以设法以某种方式调整该消息的输出,但它仍将是一条消息,而不是特定于嵌套模型遇到的问题。
话虽如此,accepts_nested_attributes_for 确实允许 reject_if 参数。这并没有真正帮助我,因为我需要在嵌套模型上为多个条目运行唯一性验证(一个父母的许多孩子都需要有一个唯一的名字)。
总结:
我认为我需要在子模型中运行验证,但要找到一种方法通过accepts_nested_attributes_for 向父模型报告,并带有特定 消息。这本质上就是我正在寻找的东西! 我想我需要编写一个自定义验证器。有什么想法吗?
【问题讨论】:
-
你试过这个
validates_associated :children , :message=> lambda{|class_obj, obj| obj[:value].errors.full_messages.join(",") } -
在您的子模型中...为什么要向子模型添加错误?
errors.add(:children???您肯定只是将错误添加到无效(或基础)的属性中吗? -
@VrushaliPawar - 这不起作用,而且,如果它确实起作用,它将仅限于一条消息,而不是特定于验证失败的原因。请参阅上面关于“accepts_nested_attributes_for”的更新
-
@TarynEast - 你是对的。我更新了我的问题,尽管这并没有真正改变这个问题的任何基本内容。
-
好吧,如果那是导致重复错误的原因:)