Ruby on rails Rails接受\u嵌套的\u属性\u对事务对象进行验证

Ruby on rails Rails接受\u嵌套的\u属性\u对事务对象进行验证,ruby-on-rails,validation,nested,Ruby On Rails,Validation,Nested,为了让嵌套属性的验证在我的rails应用程序中正常工作,我已经苦苦挣扎了几个小时。一个小警告是,我必须根据嵌套属性的父属性动态地验证它们,因为所需的信息量随着时间的推移会根据父属性在流程中的位置而变化 这是我的设置:我有一个具有许多不同关联模型的父对象,我希望在每次保存父对象时验证这些模型的嵌套属性。鉴于验证是动态变化的,我必须在模型中编写一个自定义验证方法: class Parent < ActiveRecord::Base attr_accessible :children_att

为了让嵌套属性的验证在我的rails应用程序中正常工作,我已经苦苦挣扎了几个小时。一个小警告是,我必须根据嵌套属性的父属性动态地验证它们,因为所需的信息量随着时间的推移会根据父属性在流程中的位置而变化

这是我的设置:我有一个具有许多不同关联模型的父对象,我希望在每次保存父对象时验证这些模型的嵌套属性。鉴于验证是动态变化的,我必须在模型中编写一个自定义验证方法:

class Parent < ActiveRecord::Base
  attr_accessible :children_attributes, :status
  has_many :children
  accepts_nested_attributes_for :children
  validate :validate_nested_attributes
  def validate_nested_attributes
    children.each do |child|
      child.descriptions.each do |description|
        errors.add(:base, "Child description value cant be blank") if description.value.blank? && parent.status == 'validate_children'
      end
    end
  end
end


class Child < ActiveRecord::Base
  attr_accessible :descriptions_attributes, :status
  has_many :descriptions
  belongs_to :parent
  accepts_nested_attributes_for :descriptions
end
验证适用于第一级关联,例如,如果子级具有“value”属性,我可以按我的方式运行验证。问题在于深度关联显然无法在保存前验证

有人能告诉我如何解决这个问题的正确方向吗?我目前看到的唯一方法是保存记录,随后对其进行验证,如果验证失败,则删除/恢复记录,但我真诚地希望有更干净的记录

提前谢谢大家

解决方案

结果证明,我是通过直接引用自定义验证中的模型,在深层嵌套模型上运行验证的,如下所示:

class Parent < ActiveRecord::Base
  [...]
  has_many :descriptions, :through => :children
  [...]
  def validate_nested_attributes
    descriptions.each do |description|
      [...]
    end
  end
end
类父级:子项
[...]
def验证_嵌套_属性
描述。每个do |描述|
[...]
结束
结束
结束
出于某种原因,这导致了我在上面遇到的问题。感谢Santosh测试我的示例代码并报告它正在工作,这为我指明了正确的方向

作为将来的参考,原始问题中的代码适用于这种动态、深度嵌套的验证。

我认为您应该使用它

在Child中使用以下验证

validates :value, :presence => true, :if => "self.parent.status == 'validate_children'"

嗨,桑托什,谢谢你的快速回答!我已经进入了一个新的领域,但这里的普遍感觉是,这比什么都麻烦。是否有一种方法可以仅从父级模型验证关联的记录属性,而不涉及它们自己的模型?这是必要的,因为在我的设置中,子对象可以在数据库中不带值,但前提是父对象的状态与“validate_children”不同。在这种情况下,您可以在子对象中添加验证,如:validates:value、:presence=>true、:if=>“self.parent.status=='validate_children'”嘿,Santhosh,再次感谢您的回复。问题是,我的应用程序比示例要复杂一些,而且它还涉及多态关联,因此最好将验证保持在父级。我刚刚发现验证在一级嵌套模型上有效,但在深层嵌套模型上无效。例如,如果孩子们有描述,验证将对孩子们有效,但不会对他们的描述有效。我用Post Comment模型尝试了你的代码,它对我有效。(我已经更改了错误。将[:base,msg]添加到错误。添加(:base,msg))感谢您的帮助Santhosh,我仍然无法让它在我这边工作,不幸的是,代码比示例复杂得多,这使得复制粘贴到这里变得很困难。目前,我将第一级验证保留在模型中,并将深层嵌套的验证移动到控制器中,如果第一次验证通过,我必须首先保存记录,然后检查深层的验证。我将尝试一个更简单的版本,看看它是否像它为您所做的那样工作。您的代码中几乎没有错误。可能是打字错误。1. '子值不能为空'--单引号内的单引号。2. && parent.status='validate_children'--这不是比较。这是我的任务,很抱歉打字错误!这里的代码只是我的应用程序的一个简化示例,所以这不是它不工作的原因,但感谢您指出:)
validates :value, :presence => true, :if => "self.parent.status == 'validate_children'"