【问题标题】:rails : validation vs reject_if in nested formsrails : 嵌套表单中的验证 vs reject_if
【发布时间】:2017-03-02 19:54:17
【问题描述】:

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

  1. 如果模型 B 对应的 :required 字段为 false,则允许为空,但不应保存,即该条目不应引发验证错误,而应被 :reject_if 拒绝。李>
  2. :required 字段为真的条目不允许为空。这些条目不应被:reject_if 拒绝,但在将其保存到 db 时会引发验证错误。

    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
    

我应该这样做吗

  1. accepts_nested_attributes_for:reject_if 选项中(在modelA 类中)和validates_presence_of modelB_entry 方法中(在modelB 类中)或
  2. :reject_if 中的所有内容或
  3. :validates_presence_of 中的所有内容?

先执行哪个:reject_if 或 vaildation?

【问题讨论】:

    标签: ruby-on-rails validation nested-forms activemodel


    【解决方案1】:

    reject_ifvalidations 有不同的用途。

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

    reject_if的使用

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

    因此,在这种情况下,您将检查 reject_if 中的所有字段是否为空白,如果是这种情况我们可以忽略记录,否则让模型完成它的工作。

    另外,请记住,reject_if 不保证数据完整性。因为任何典型的 RoR 应用程序都有多个入口点。

    在我看来,您应该选择第一个选项。同时使用reject_if 和验证

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-31
      • 2014-09-20
      相关资源
      最近更新 更多