2014-05-11 3 views
0

patient 모델이 있습니다. patient을 등록하려고하면 그는 필드를 채 웁니다 (예 : name, email, telephone).이 필드에는 유효성 확인 presence이 있습니다. 또한 의사가 자신을 위해 환자를 추가 할 수있는 또 다른 양식이 있습니다.이 양식에는 필드가 하나만 있습니다. name.일부 필드의 유효성 검사 건너 뛰기

질문 : 어떻게 든 필드 emailtelephone에 검증을 생략하지만 name에 검증을 남길 수 있습니다?

순간

, 나는이 작업이 있습니다

def add_doctor_patient 
    @patient = @doctor.patients.new(patient_params) 
    if params[:patient][:name].present? and @patient.save(validate: false) 
    redirect_to doctor_patients_path(@doctor), notice: 'Added new patient.' 
    else 
    render action: 'new' 
    end 
end 

name가 PARAMS에서 나는 검증을 생략하고 환자를 저장하지만, name가 존재하지 않을 때, 그것은 그냥 오류와 new 조치를 렌더링 존재 , simple_form은 붉은 색으로 필드를 표시하지 않습니다. 어쩌면 오류를 제기 할 수있는 방법이 있을까요 아니면 다른 솔루션일까요?

UPD

솔루션 다음 wintermeyer 응답 다음과 같습니다. 내가 patientbelongs_to: doctor이라는 관계를 가지고 있으므로, hidden_field_tag :doctor_id, value: @doctor.id을 사용할 수 있으며, 사람들이 말한 것처럼 확인하십시오 : unless: ->(patient){patient.doctor_id.present?}. P. 누군가가 고안을 사용하는 경우 emailpassword에 필요한 유효성 검사를 건너 뜁니다. 우리는이 같은, 내 경우 Patient에, 모델 뭔가를 추가 할 수 있습니다

validates :name, presence: true 
validates :email, presence: true, unless: ->(patient){patient.name.present?} 

답변

1

같은 간단한 질문을하지만 더 이상 내가 생각 것 같다 :

def password_required? 
    false if self.doctor_id.present? 
end 

def email_required? 
    false if self.doctor_id.present? 
end 
0

당신은 그런 식으로 뭔가를 할 수 더 많은 가능한 솔루션이 나오게됩니다. 어느 것이 DRYest인지 알기가 힘듭니다. 더 빠르고 더러운 해결책은 숨겨진 부울 필드 xyz을 의사의 양식에 추가하는 것입니다. 당신은 당신이 그와 함께 레일 (4)을 사용하는 당신은 당신의 모델이 뭔가를 할 수 있다면 컨트롤러의 바닥에 그 속성을 추가해야 할 것 :

validates :name, presence: true 
validates :email, presence: true, unless: ->(patient){patient.xyz.present?} 
+2

주어진 문제에 대한 해결책이 아닙니다. 'name'은 언제든지 확인되어야합니다. – wintermeyer

+0

이 코드를 사용하면'name'도 유효성이 검사되고'name'이 없다면'email'의 존재는 require입니다. 나는 name에 대한 유효성 검사를 추가했다. – BriceB

+0

이름이 존재할 경우 등록 양식의 유효성 검사를 건너 뜁니다. – yozzz

0

내가 추가 필드가 환자에 추가 것이다 환자가 스스로 등록했는지 여부를 나타냅니다.

그래서 예를 들어 patient 또는 doctor, 또는 환자가 자신을 등록하는 경우 true 인 부울 필드 self_registered 수 중 필드 source를 추가합니다.

귀하의 유효성 검사 만 그 시간에 더 이상 알 수 있기 때문에 (사용자를 생성하지만, 편집 할 때/나중 단계에서 사용자를 업데이트하는 것은 실패 할 때 작품 임시 필드를 사용하지

validates :name, presence: true 
validates :email, presence: true, if: -> (patient.is_self_registered?) 

될 것 환자가 자신을 등록했거나 등록하지 않았다면, - 당신은 그것을 추측 할 수는 있었지만 확실하게 알 수는 없었습니다.)

0

"조건부"유효성 검사를 수행하는 보석을 썼습니다. 결론적으로 조건부 유효성 검사를 수행하는 가장 좋은 방법은 비표준 유효성 검사 규칙을 사용할시기를 컨트롤러가 결정하도록하는 것입니다.따라서 RESTful 사례를 가능한 많이 따르는 경우 환자 양식 제출과 의사를위한 다른 컨트롤러가 있어야합니다. 아니면 적어도 말하면 어떤 방법으로, 그렇지 않습니까? 어떤 경우이든 컨트롤러는 유효성 검사와 관련하여 모델을 지시 할 수 있습니다. 여기에 희망이 너무 귀하의 상황에 적합한 느낌 ... 보석에 대한 링크입니다 :

https://github.com/pdobb/conditional_validation

는 기본적으로, 나는 "validation_accessor"를 부르는 가상 속성이 설정 주위에 몇 래퍼 방법을 제공합니다. 그런 다음 다른 사람들이이 스레드에서 제안하는 것과 동일한 종류의 구문에 대한 설탕을 제공합니다. 내가하고 싶은 무엇

1

합니다 (모델)입니다 : 컨트롤러에서 다음

attr_accessor :skip_validations 

validates :name, presence: :true 
validates :email, presence: :true, unless: :skip_validations 
validates :telephone, presence: :true, unless: :skip_validations 

: 그것은 내가 그것을 청소기 찾아 다른 답변과 동일하지 입력해도

patient = Patient.new(patient_params) 
patient.skip_validations = true 

.

관련 문제