2012-09-13 46 views
2

我有一個嵌套屬性的表單。我正在向學校註冊一名學生,學生可以有很多緊急聯繫人。Rails 3.如果全部保留爲空,則不驗證嵌套屬性

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個緊急聯繫人,然後我會得到驗證錯誤的緊急聯繫人的名稱不能爲空。我怎樣才能使它不驗證,如果該表格中的所有字段都是空白的?

回答

9

我假設你在學生模型中設置了accept_nested_attributes,你需要添加:reject_if proc。將忽略該行,如果proc評估爲真

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

如何生成reject_if爲true時表單驗證錯誤,以便用戶可以更正錯誤?它只是不保存任何內容並向用戶報告驗證錯誤。 – GeorgeW

+1

嘗試'accep_nested_attributes_for:relations',然後在下一行,'validates_associated:relations'在這種情況下,您不需要':reject_if'選項。有關更多信息,請參閱http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#method-i-validates_associated。 – niiru

+0

@niiru說到嵌套資源,如果我需要***忽略行,如果所有字段都是空白***,但如果***任何字段填充,驗證孔資源***並向用戶顯示錯誤。 –

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