Rails 3.如果全部留空,则不验证嵌套属性

时间:2012-09-13 15:41:43

标签: ruby-on-rails ruby

我有一个带有嵌套属性的表单。我正在向学校注册学生,学生可以有很多紧急联系人。

class EmergencyContact < ActiveRecord::Base
  attr_accessible :full_name, :relationship, :mobile_phone, :student_id
  belongs_to :student

  validates :full_name, :presence => true
  validates :relationship, :presence => true

end

所以我有一个表格来注册学生,然后有3行输入紧急联系人。类似于以下(当然这是一个过于简化的版本......

Student Name: _____________

Emergency Contacts
------------------------------------------
| Name         | Relationship             |
------------------------------------------
|              |                          |
------------------------------------------
|              |                          |
------------------------------------------
|              |                          |
------------------------------------------

如果我只输入2个紧急联系人,那么我将得到验证错误,即紧急联系人的姓名不能为空。 如何确保该特定紧急联系人表单中的所有字段都是空白的?

2 个答案:

答案 0 :(得分:9)

我假设您在学生模型中设置了accepts_nested_attributes。您需要添加:reject_if proc。如果proc计算结果为true,它将忽略该行。

class Student < ActiveRecord::Base 
  has_many                      :emergency_contacts
  accepts_nested_attributes_for :emergency_contacts, 
                                :reject_if => lambda { |a| a[:full_name].blank? }
end

您可以根据需要将其修改为lambda { |a| a[:name].blank? && a[:relationship].blank? }等内容。

答案 1 :(得分:6)

您还可以将其修改为更通用的内容,例如

proc { |attributes| 
    attributes.delete :_destroy
    attributes.reject { |key, value| value.blank? }.empty?
}

修改

你也可以用最简单的方式做到这一点

accepts_nested_attributes_for :emergency_contacts, :reject_if => :all_blank

您可以在此处找到一些文档:http://api.rubyonrails.org