2011-03-17 7 views
4
class Parent 
    has_one :child 
    accepts_nested_attributes_for :child 
end 
class Child 
    belongs_to :parent 
end 

중첩 된 개체 형식을 사용하여 하위 모델에 몇 가지 추가 유효성 검사를 추가해야합니다. 이것들은 항상 하위에서 실행되는 것은 아니므로 하위의 validate 메소드에 넣을 수는 없습니다. Parent의 validate 메소드에서 검사하는 것이 현명한 것으로 보이지만 오류 메시지를 올바르게 추가하는 데 문제가 있습니다.중첩 모델에 대한 사용자 정의 유효성 검사 오류

이가하는 일 :

class Parent 
... 
def validate 
    errors[ :"child.fieldname" ] = "Don't be blank!" 
end 

그러나 우리는 국제화와 CSS 오류 필드에 강조와 같은 좋은 점을 잃게됩니다. 당신이 if:로 조건문을 설정할 수 있습니다, 즉 그러나 검증 한 이후

def validate 
    errors.add :"child.fieldname", :blank 
end 
+0

내 생각은 항상 하위 모델에 대해 자식 유효성 검사를 수행하는 것입니다. 왜 그렇게하지 않습니까? –

+0

다른 상황에 대한 유효성 검사가 다릅니다. 필자의 특별한 경우에는 부모가없는 자식 모델이 만들어지며 부모를 통해 생성 된 자식 모델보다 느슨한 유효성 검사가 수행됩니다. –

+8

부모의 존재를 조건으로합니다. 여전히 자녀 모델에 보관해야합니다. –

답변

1

당신은 하위 모델에 보관해야하며 unless:

class Order < ActiveRecord::Base 
    validates :card_number, presence: true, if: :paid_with_card? 

    def paid_with_card? 
    payment_type == "card" 
    end 
end 

당신은 할 수 있습니다

이 작동하지 않습니다 이것에 대한 몇 가지 변형을해라. 레일 문서에 더 많이 읽어라. http://edgeguides.rubyonrails.org/active_record_validations.html#conditional-validation

나는 속성 01을 추가 할 수 있었다고 생각한다.을 자식에게 보내고, 해당 자식에 따라 사용할 유효성 검사를 Child가 선택하도록합니다. 이 답변에서와 같이 할 수 있습니다. Rails how to set a temporary variable that's not a database field

관련 문제