2014-12-09 3 views
-1

레일에서 사용자 지정 유효성 검사를 배우기 위해 두 양식 필드를 비교하기 위해 적용하려고합니다. 지금까지 나는 app/validation/pin_validator.rb에 저장 한 사용자 정의 사용자 정의 유효성 검사기에 하나의 값을 쉽게 전달할 수 있으며 정상적으로 작동합니다.두 가지 양식 필드를 비교하기 위해 사용자 정의 유효성 검사 도구 사용하기

class PinValidator < ActiveModel::EachValidator 
    def validate_each (record, attribute, value) 
    if value1 > value2 
     record.errors[attribute] << (options[:message] || "validator working") 
    end 
    end 
end 

그리고이 같은 뭔가 모델에서 호출 :

validates :pin_number, :id_string, pin: true 
하지만 정말 양식에서 데이터의 두 조각을 받아들이 다음과 같은 것을 설정 같은 거라고

어디 :id_string:pin_number은 모두 양식 필드하며 value1으로 비교 될 것이며,이 작업을 수행 할 수있는 방법이 value2

있습니까?

미리 감사드립니다.

참고 : 위의 값 비교는 실제로 약간의 자바 스크립트로 프런트 엔드에서 해결할 수 있습니다. 서버 측 솔루션을 요구하는 이유는 궁극적으로 두 값을 데이터베이스의 항목 집합과 비교하려고하기 때문입니다. 위의 예는 제 질문을 단순한 것으로 단순화하는 것입니다.

답변

1

당신이 @attributes에서 값을 사용하여 record 속성에 액세스 할 수 있도록 here

이니셜 코드에서 추론 할 수있는 당신의 validate_each 방법 내부 @attributes 나열 속성에 액세스 할 수 있어야는 속성이있는 배열입니다 귀하의 경우 [:pin_number, :id_string]에 유효성 검사의 정의에 사용 된 이름. 당신은 내가이 검증 정의에 나열된 각 필드에 출마하기로함에 따라 validate_each 방법은 두 번 실행하는 것입니다 실현

def validate_each(record, attribute, value) 
    value1 = record[@attributes[0]] # :pin_number 
    value2 = record[@attributes[1]] # :id_string 
    # the rest of the logic here 
end 

처럼 액세스 할 수 있습니다. 오류가 두 번 삽입되거나 다른 문제가 발생할 수 있습니다. 유효성 검사기 인스턴스가 생성 될 때마다 유효성 검사가 실행될 때마다 조사 중이므로 플래그를 설정하여이 이중 유효성 검사를 피할 수 있다면 @already_run라고 말한 다음 두 번째로 해당 플래그가 참인 경우에만 반환됩니다. 다음에 검증 자의 새로운 인스턴스가 생성 될 것이므로 유효성을 검사 할 필요가있는 모든 것이 있으면 그 플래그는 다른 것에 영향을 미치지 않습니다.

+0

안녕하세요, 응답 해 주셔서 감사합니다! 나는 내가 따라하기가 두렵다. (난 레일에 새로운 편이다.) 조금 더 정교 할 수 있니? – neanderslob

+0

물론 지금은 응답을 추가하지만 기본적으로 심볼 배열 인'@ attributes' 인스턴스 변수를 확인할 수 있습니다. 각 심볼은 유효성 검사 선언에 나열된 각 속성의 이름이'validates : attrib1, : attrib2, pin : true' – rafb3

+0

당신은 록 스타입니다. 많은 감사합니다! 필자가 기대하지 못했던 이상한 기발함은'value1'과'value2'를 모두 사용하기 위해서 유효성 검사 호출에': pin_number'와': id_string'을 모두 포함시켜야한다는 것입니다. : pin_number, : id_string, pin : true' – neanderslob

1

레일 측면에서 유효성 검사를 수행하는 대신 JS 유효성 검사 방법 인 onClick을 사용하거나 적절한 제어를 제공하는 다른 동작을 고려할 수 있습니다.

onClick에 필요한 것은 각각의 고유 한 이름이 지정된 양식 필드에서 값을 가져온 다음 각 필드의 val()을 비교하고 제출을 허용/거부하는 간단한 방법입니다.

양식 필드를 DB에 저장된 값과 비교해야하는 경우 <input type="hidden>을 사용하고 페이지로드시 해당 값을 저장하여 위에서 설명한 것과 같은 방법으로 비교할 수 있습니다.

+0

안녕하세요 Dan, 조언 해 주셔서 감사합니다. 위의 응용 프로그램을 감안할 때, 당신은 옳습니다; 그것이 최선의 방법 일 것입니다. 그러나, 나는 실제로 배울 것을 시도하고있는 개념을 증류하기 위하여 위에 가치 비교를 사용하고있다.궁극적으로 필자는 일련의 데이터베이스 값과 비교하기 위해 두 개의 값을 전달하고자하기 때문에 레일 측면에 관심이 있습니다. – neanderslob

+0

레일 커스텀 밸리데이션으로 시도하고있는 것이 가능한지 나는 실제로 모른다. 나는 누군가가 이것을 처리하는 좋은 트릭을 가지고 있는지 궁금합니다. –

+0

숨겨진 필드 또는 그와 비슷한 값을 저장하고 준비가되었을 때 비교하여 값을 JS에 저장해도 여전히 JS로이를 해결할 수 있습니다. 나는 그것이 최선의 접근법 일 것 같기 때문에 내 대답을 업데이트 할 것이다. –