`reject_if`的基本原理是什么?

时间:2015-07-16 23:20:09

标签: ruby-on-rails activerecord cocoon-gem

我在cocoon的READMENested Attributes的文档中遇到reject_if。当关联的活动记录对象可以确定它们是否有效时,使用reject_if的基本原理是什么?

2 个答案:

答案 0 :(得分:2)

对于嵌套对象,您可能不想尝试提交:all_blank或您可能想要检查的任何其他原因的记录。关键是,一个空的或不完整的(以某种方式)对象可以这样简单地不被构建/添加到嵌套对象集合中。

验证有不同的用途。如果一个空对象,例如,验证失败,那么整个表单提交将失败。 reject_if方法允许提交在这种情况下成功,方法是在验证之前将对象从考虑中删除。

答案 1 :(得分:0)

Rails指南介绍了:reject_if的基本原理,但它没有明确地将此选项与仅验证子对象进行比较:

  

9.5 Preventing Empty Records

     

忽略用户没有的字段集通常很有用   填写。你可以通过传递: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的任何值。