2012-01-14 4 views
0

관련 모델이 두 개 있습니다 (ApartmentLessor). 그리고 양식에서 Lessor을 생성 할 수 있어야합니다.Rails에서 연결의 유효성을 검사하는 가장 좋은 방법은 무엇입니까?

belongs_to :lessor 
before_save :save_lessor 
... 
def lessor_cellphone= val 
    @cellphone = val 
end 
... 
private 
def save_lessor 
    if Lessor.exists? :cellphone => @cellphone 
    self.lessor = Lessor.find_by_cellphone @cellphone 
    else 
    self.create_lessor :cellphone => @cellphone 
    end 
    @cellphone = nil 
end 

모델 Lessor에서 : Apartment 모델에서

validates :cellphone, :format => {:with => /\d{11}/}, :uniqueness => true 
has_many :apartments, :dependent => :nullify 

을하지만 잘못된 cellphoneApartment을 만들려고 할 때, Lessor는 검증이 실패 렸기 때문에 생성되지 않지만,`아파트가 생성됩니다 .

양식에서 cellphone (이상) 및 상승 오류의 유효성을 검사하는 가장 좋은 방법은 무엇입니까?

답변

2

더 좋은 해결책은 을 사용하여 중첩 모델을 다른 형식으로 생성하는 것입니다.

텍스트 버전은 http://railscasts.com/episodes/196-nested-model-form-part-1 또는 http://asciicasts.com/episodes/196-nested-model-form-part-1을 참조하십시오. 기존 솔루션을 사용하려는 경우

Nontheless : 당신이 before_* 콜백 모든 나중에 콜백 및 취소 관련 행동에 false를 반환하는 경우 을 http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

그래서 나는 그것이

같은 것 같아요 참조 , 임대인 존재 레 경우에
def create_lessor(data) 
    # validate data here 
    return false if # data not valid 
end 

def save_lessor 
    rc = true 
    if Lessor.exists? :cellphone => @cellphone 
    self.lessor = Lessor.find_by_cellphone @cellphone 
    else 
    rc = self.create_lessor(:cellphone => @cellphone) 
    end 
    @cellphone = nil 
    rc # return the return code 
end 

전혀 아름다운 해결책이 아니다,하지만 난 당신이 아이디어를 얻을 생각 ...

+0

아파트를 연결하는 것이 가능 'accepts_nested_attributes_for'를 사용하여 휴대 전화의 레코드가 이미 존재합니까? –

+0

물론. 새 레코드가 생성되거나 기존 레코드가 업데이트되면 아무런 변화가 없습니다. 올바른 레코드로 '빌드'해야합니다. – Vapire

관련 문제