Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 嵌套表单-如何基于子模型的输入验证父模型?_Ruby On Rails_Ruby_Validation_Nested Forms - Fatal编程技术网

Ruby on rails 嵌套表单-如何基于子模型的输入验证父模型?

Ruby on rails 嵌套表单-如何基于子模型的输入验证父模型?,ruby-on-rails,ruby,validation,nested-forms,Ruby On Rails,Ruby,Validation,Nested Forms,有一个嵌套的表单,关系是这样的 class Inspection < ActiveRecord::Base has_many :inspection_components accepts_nested_attributes_for :inspection_components class InspectionComponent < ActiveRecord::Base belongs_to :inspection 类检查

有一个嵌套的表单,关系是这样的

class Inspection < ActiveRecord::Base
  has_many :inspection_components
  accepts_nested_attributes_for :inspection_components

class InspectionComponent < ActiveRecord::Base
  belongs_to :inspection
类检查
我在Inspection中有一个自定义的验证方法,它取决于为InspectionComponent输入的属性。如何验证-检验组件属性在检验验证中未保存或不可用

谢谢

编辑:为了让事情更清楚一点,这里有一个我正在尝试做的例子

检验具有属性状态。 InspectionComponent还具有属性状态

检验编辑表单具有嵌套的检验组件,可以在此表单上更新每个模型的状态@如果所有@inspection\u component.status==“complete”,则inspection.status只能标记为“complete”

因此,在验证@inspection时,我必须能够看到用户为@inspection\u component.status输入的内容

显然,我可以访问控制器中两个实例的参数,但是在应该进行验证的模型中,我看不到实现这一点的方法


希望这是清楚的,谢谢。

您想使用
验证\u关联的

可能是这样的:

validates_associated :inspection_components

对它进行搜索并查找api。这个方法也有一些有用的选项。

好的,如果我发布的另一个答案对其他人有用,那么我会给出一个新的答案。具体到你的问题,我认为你需要这样的东西:

class Inspection < ActiveRecord::Base
  has_many :inspection_components
  accepts_nested_attributes_for :inspection_components

  # we only care about validating the components being complete
  # if this inspection is complete. Otherwise we don't care.
  validate :all_components_complete, :if => :complete

  def complete
    self.status == 'complete'
  end

  def all_components_complete
    self.inspection_components.each do |component|
      # as soon as you find an incomplete component, this inspection
      # is INVALID!
      Errors.add("field","msg") if component.status != 'complete'
    end
  end
end

class InspectionComponent < ActiveRecord::Base
  belongs_to :inspection
end
类检查:完成
def完成
self.status==“完成”
结束
def所有_部件_完成
自检|部件。每个do |部件|
#一旦发现不完整的部件,请立即进行检查
#这是无效的!
错误。如果component.status!='完全的
结束
结束
结束
类检查组件
Hi-谢谢您的回复。这里的问题是,这仍然是相互独立地进行验证。我的意思是,在检查验证中,您不知道在检查组件子项中发生了什么变化,反之亦然,在检查组件验证中,您不确定提交给检查父项的内容。嗯。。。我可能需要查看更多的代码,以便更好地理解您正在尝试执行的操作。你能编辑你的帖子或者给我更多关于你想做什么的信息吗?通常,我会从
rails my_app
发布一步一步的说明,这里有这样那样的文件:
,这会给我一个很好的答案。嗨,DJTripleThreat-我已经更新了OP,希望能更清楚地了解我在做什么,谢谢你的关注。好的,看看我的其他答案。我想这就是你要找的。还可以看看这条铁路史:嗨,DJTT,再次感谢。有趣的是,这种类型的验证策略确实适用于检查及其InspectionComponents的创建,但是一旦情况发生更新,我似乎无法访问验证方法中的子InspectionComponents updated属性(所有组件都已完成)。当我调试和检查每个inspection_组件时,它们仍然有旧的值。好的,让我再考虑一下,看看我能想出什么。编辑:这是我的工作。如果您发布您的电子邮件地址,我将向您发送一封包含我创建的项目的电子邮件。我认为您可能在尝试更新属性之前对视图或属性做了一些错误的操作。是的,但是它并没有解决整个问题,请参阅您帖子下方的我的评论。谢谢