2016-10-20 3 views
1

모델 B에 대해 중첩 된 속성을 허용하는 모델 A가 있습니다. 모델 B 항목의 수와 항목이 필요한지 여부는 db의 세 번째 테이블을 기반으로 결정됩니다. 모델 B 항목에 대해 fields_for가있는 양식을 생성하려면 form_for를 사용합니다. 이것은 검증이 작동해야하는 방법이다 :rails : 중첩 된 형식의 유효성 검증 vs reject_if

  1. 모델 B에 대한 항목이 해당 :required 필드가 false 인 경우 공백이 허용되지만,이 저장되지해야 즉, 검증 오류가 발생하지 않아야이 항목 만 :reject_if에 의해 거부되어야합니다.
  2. :required 필드가 true 인 항목은 비워 둘 수 없습니다. 이러한 항목은 :reject_if에 의해 거부되어서는 안되지만 db에 저장 될 때 유효성 검사 오류가 발생합니다.

    class modelA < ApplicationRecord 
        has_many :modelBs, dependent: :destroy 
    
        accepts_nested_attributes_for :modelBs, reject_if: :not_required_and_blank? 
    
        def not_required_and_blank? 
        # return true if modelB.entry is blank && modelB.required_entry? is false 
        end 
    end 
    
    class modelB < ApplicationRecord 
        belongs_to :modelA 
        validates :modelB_entry, presence: true, if: :required_entry? 
    
        def required_entry? 
        ModelC.find(:id).required 
        end 
    end 
    

나는 (MODELA 클래스) 및 (modelB 클래스) validates_presence_of modelB_entry 방법 또는 :reject_if 또는 에서

  • 모든 일에 accepts_nested_attributes_for:reject_if 옵션이

    1. 해야
    2. :validates_presence_of에있는 모든 내용은?

    먼저 실행되는 항목 : reject_if 또는 vaildation?

  • 답변

    2

    reject_ifvalidations은 다른 용도로 사용됩니다.

    두 필드가 nametitle이고 중첩 된 필드가 name 인 중첩 모델이 있다고 가정 해보십시오. 컨트롤러 #new 행동에 reject_if

    를 사용하여, 당신은 그가 쉽게 그 형태에 추가 할 수있는 다른 무엇을 볼 수 있도록 자신을 사용자에게 더 나은 UI 경험을 제공하는 최초의 중첩 된 객체를 구축하기로 결정. 또는 사용자가 '+ 추가'버튼을 클릭하면됩니다. 그런 다음 modelB을 비워두고 정보를 입력하지 않기로 결정합니다. 이제 reject_if을 사용하지 않더라도 유효성을 확인하면 사용자는 remove 버튼을 클릭하지 않으면 입력란이 비어 있으며 양식을 제출할 수 없다는 오류 메시지가 표시됩니다.

    그래서이 경우에는 reject_if에서 모든 필드가 비어 있는지 확인합니다. 그렇다면 레코드를 무시할 수있는 경우 모델이 작동하도록하십시오.

    또한 reject_if는 데이터 무결성을 보장하지 않습니다. 일반적인 RoR 앱에는 여러 개의 진입 점이 있습니다.

    제 생각에는 첫 번째 옵션을 선택해야합니다. reject_if 및 유효성 확인

    을 모두 사용하십시오.
    관련 문제