我在cocoon的README和Nested Attributes的文档中遇到reject_if
。当关联的活动记录对象可以确定它们是否有效时,使用reject_if
的基本原理是什么?
答案 0 :(得分:2)
对于嵌套对象,您可能不想尝试提交:all_blank
或您可能想要检查的任何其他原因的记录。关键是,一个空的或不完整的(以某种方式)对象可以这样简单地不被构建/添加到嵌套对象集合中。
验证有不同的用途。如果一个空对象,例如,验证失败,那么整个表单提交将失败。 reject_if
方法允许提交在这种情况下成功,方法是在验证之前将对象从考虑中删除。
答案 1 :(得分:0)
Rails指南介绍了:reject_if
的基本原理,但它没有明确地将此选项与仅验证子对象进行比较:
忽略用户没有的字段集通常很有用 填写。你可以通过传递
:reject_if
proc来控制它accepts_nested_attributes_for
。每个都会调用此proc 表单提交的属性哈希值。如果proc返回false
那么Active Record不会为该哈希构建关联对象。 如果kind
,下面的示例仅尝试构建地址 属性已设置。class Person < ActiveRecord::Base has_many :addresses accepts_nested_attributes_for :addresses, reject_if: lambda {|attributes| attributes['kind'].blank?} end
为方便起见,您可以改为传递符号
:all_blank
将创建一个proc,它将拒绝所有属性的记录 是空白的,不包括_destroy
的任何值。