Ruby on rails rails:在嵌套表单中验证与拒绝
我有一个模型a,它接受模型B的嵌套属性。模型B条目的数量以及是否需要条目取决于数据库中的第三个表。我使用form_为模型B条目生成带有字段_的表单。这就是验证工作所需的方式: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
: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
中的所有内容:如果或
中的所有内容:验证是否存在
首先执行哪一项:如果有效,则拒绝?
如果有效,则拒绝?
和验证有不同的目的
假设您有一个嵌套模型modelB
,其中包含两个字段name
和title
,其中name
为必填字段
如果
在controller#new
操作中,您决定自己构建第一个嵌套对象,以便为用户提供更好的UI体验,以便用户可以轻松地看到他还可以添加到表单中的内容。或者用户自己点击“+添加更多”按钮。但随后决定将modelB
留空,不在其中输入任何信息。现在,如果您不使用reject\u if
但您进行了验证,用户将收到错误消息,说明字段为空,并且他将无法提交表单,除非他单击删除按钮
因此,在本例中,您将检查拒绝\u if
中的所有字段是否为空,如果是这种情况,我们可以忽略该记录,否则让模型执行其工作
此外,请记住,如果拒绝,则不能保证数据完整性。因为任何典型的RoR应用程序都有多个入口点
依我看,你应该选择第一种。使用拒绝\u if
和验证