2012-09-13 3 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 

학생을 등록 할 양식이 있고 긴급 연락처를 입력하는 행이 있습니다. (난 단지 2의 비상 연락처를 입력하면 비상 연락처의 이름은 비워 둘 수 없습니다 것을, 그때는 유효성 검사 오류가 발생합니다

Student Name: _____________ 

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

이 ... 물론 아주 간략 버전 다음과 유사합니다. 해당 비상 연락처에 대한 양식의 모든 입력란이 비어있는 경우 유효성을 검사하지 못하게하려면 어떻게해야합니까?

답변

9

학생 모델에 accepts_nested_attributes가 설정되어 있다고 가정합니다 : reject_if proc. It 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

생성 방법 사용자가 오류를 수정할 수 있도록 reject_if가 true 일 때 양식 유효성 검사 오류가 발생합니까? 아무 것도 저장하지 않고 사용자에게 유효성 검증 오류를보고합니다. – GeorgeW

+1

'accepts_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

관련 문제