Ruby on rails rails:在嵌套表单中验证与拒绝

Ruby on rails rails:在嵌套表单中验证与拒绝,ruby-on-rails,validation,nested-forms,activemodel,Ruby On Rails,Validation,Nested Forms,Activemodel,我有一个模型a,它接受模型B的嵌套属性。模型B条目的数量以及是否需要条目取决于数据库中的第三个表。我使用form_为模型B条目生成带有字段_的表单。这就是验证工作所需的方式: 如果对应的:required字段为false,则允许模型B的条目为空,但不应保存该条目,即该条目不应引发验证错误,但应被:reject\u(如果)拒绝 :required字段为true的条目不允许为空。这些条目不应被:reject_if拒绝,但在保存到数据库时会引发验证错误 class modelA < Applic

我有一个模型a,它接受模型B的嵌套属性。模型B条目的数量以及是否需要条目取决于数据库中的第三个表。我使用form_为模型B条目生成带有字段_的表单。这就是验证工作所需的方式:

  • 如果对应的
    :required
    字段为false,则允许模型B的条目为空,但不应保存该条目,即该条目不应引发验证错误,但应被
    :reject\u(如果
    )拒绝
  • :required
    字段为true的条目不允许为空。这些条目不应被
    :reject_if
    拒绝,但在保存到数据库时会引发验证错误

    class modelA < ApplicationRecord
      has_many :modelBs, dependent: :destroy
    
      accepts_nested_attributes_for :modelBs, reject_if: :not_required_and_blank?
    
      def not_required_and_blank?
         # return true if modelB.entry is blank && modelB.required_entry? is false
      end
    end
    
    class modelB < ApplicationRecord
      belongs_to :modelA
      validates :modelB_entry, presence: true, if: :required_entry?
    
      def required_entry?
        ModelC.find(:id).required
      end
    end
    
    class modelA
  • 我应该这样做吗

  • 在<代码>:如果<代码>的<代码>选项接受<代码>(在modelA类中)的嵌套属性,并且在<代码>中验证modelB\u条目<代码>方法(在modelB类中)的存在,则拒绝
  • 中的所有内容:如果
  • 中的所有内容:验证是否存在

  • 首先执行哪一项:如果有效,则拒绝?

    如果有效,则拒绝?
    验证有不同的目的

    假设您有一个嵌套模型
    modelB
    ,其中包含两个字段
    name
    title
    ,其中
    name
    为必填字段

    如果

    在controller
    #new
    操作中,您决定自己构建第一个嵌套对象,以便为用户提供更好的UI体验,以便用户可以轻松地看到他还可以添加到表单中的内容。或者用户自己点击“+添加更多”按钮。但随后决定将
    modelB
    留空,不在其中输入任何信息。现在,如果您不使用
    reject\u if
    但您进行了验证,用户将收到错误消息,说明字段为空,并且他将无法提交表单,除非他单击
    删除
    按钮

    因此,在本例中,您将检查
    拒绝\u if
    中的所有字段是否为空,如果是这种情况,我们可以忽略该记录,否则让模型执行其工作

    此外,请记住,如果拒绝,则不能保证数据完整性。因为任何典型的RoR应用程序都有多个入口点

    依我看,你应该选择第一种。使用
    拒绝\u if
    和验证