2016-06-05 4 views
0

조건부 유효성 검사를 설정하려고하는데 패스 메서드가 true 또는 false 인 경우 개체가 저장됩니다.레일 조건부 유효성 검사가 올바로 작동하지 않습니다.

test 반환 false, 나는 개체를 저장하지 않는 경우

class Foo < ActiveRecord::Base 
    belongs_to :order 
    belongs_to :user 

    validates :order, presence: true 
    validates :user, presence: true, if: :test 

    private 

    def test 
    false 
    end 
end 

컨트롤러 :

귀하의 케이스를 들어
def create 
    foo = Foo.new(foo_params) 

    if foo.save 
    render json: delivery, status: 201 
    else 
    render json: { errors: foo }, status: 422 
    end 
end 
+2

테스트가 false 인 경우 사용자 유효성 검사 만 건너 뜁니다. –

+0

아, 알겠습니다. 유효성 검사를 잘못 사용하고 있습니다. 'test'가 false를 반환하면 어떻게 객체를 저장하지 않을 수 있습니까? – Jay

+1

'if :'대신'unless : : test'를 사용할 수 있습니다. – user2936314

답변

2

, :test 경우 반환 falseuser 검증하는 것은 바로 건너 뜁니다 . 그것을

class CustomPresenceValidator < AM::EachValidator 
    def validate_each record, attribute, value 
     if options[:with].try(:[], :fail) 
     record.errors[ attribute ] << 'forced fail' 
     elsif value.blank? 
     record.errors[ attribute ] << 'can\'t be blank' 
     end 
    end 
end 

및 사용 : 당신이 실패 항상 검증을 강제하고자하는 경우에, 유효성 검사기를 교체하고 그것에 값을 전달합니다

응용 프로그램/검증/custom_presence_validator.rb

validates :user, custom_presence: { fail: true } 

또는 :before_save도 원할 수 있습니다.

+0

이것은'before_save'를 사용하는 것보다 나은 해결책입니까? – Jay

관련 문제