【问题标题】:Rails 3. Don't validate nested attributes if all left blankRails 3. 如果全部留空,则不要验证嵌套属性
【发布时间】:2012-09-13 15:41:43
【问题描述】:

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

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 个紧急联系人,那么我会收到紧急联系人姓名不能为空的验证错误。 如果该特定紧急联系人的表单中的所有字段都为空,我如何使它不验证?

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    我假设您已在 Student 模型中设置了 Accept_nested_attributes。您需要添加一个 :reject_if 过程。如果 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? &amp;&amp; a[:relationship].blank? } 等。

    【讨论】:

    • 当reject_if为真时如何生成表单验证错误,以便用户更正错误?它只是不保存任何内容并向用户报告验证错误。
    • 尝试accepts_nested_attributes_for :relations,然后在下一行,validates_associated :relations 在这种情况下您不需要:reject_if 选项。请参阅api.rubyonrails.org/classes/ActiveRecord/Validations/… 了解更多信息。
    • @niiru 谈到嵌套资源,如果我需要如果所有字段都为空白则忽略该行但是如果填写任何字段,验证孔资源并向用户显示错误。
    【解决方案2】:

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

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-20
      • 1970-01-01
      • 2011-01-07
      相关资源
      最近更新 更多