2013-09-05 2 views
0

날짜 형식을 확인하는 Google 모델 중 하나에 대한 맞춤 검증을 구축 중입니다. 따라서 날짜는 dd/mm/yyyy이어야하며 현재 dd/mm/yyyy 및 dd-mm-yyyy와 함께 작동합니다. 그러나 우리는 어떤 사람들이 ddmmyyyy에 들어가고 나서 레일이 그걸 먹어 다른 것을 뱉어 낸다고합니다. 레일 맞춤 설정 유효성 검사 - 모델 레이어

그래서 내가 전화를 내가 transaction_date 내가 다음이

def date_is_correct_format 
    validates_with DateFormatValidator 
end 

와 같은 개인 모델을 만들 유효성을 검사 할 모델 내에서

class DateFormatValidator < ActiveModel::Validator 
    def validate(record) 
    record.errors[:transaction_date] << "Date must be in the following format: mm/dd/yyyy" unless /\d{2}\/\d{2}\/\d{4}/.match(record.transaction_date) 
    end 
end 

그런 다음 사용자 지정 유효성 검사를했다 validate :date_is_correct_format

나는이 일을 전에 했었지만 이번에는 이것이 효과가없는 것처럼 보이고 아무런 예외도 일어나지 않습니다. 개인적인 방법으로도 이것을 할 수 있습니다.

def date_is_correct_format 
    this_is_a_fake_method_that_should_blow_up 
    validates_with DateFormatValidator 
end 

유효성 검사를 실행하고 모든 사항을 올바르게 전달합니다. 내가 무엇을 놓치고 있는지에 대한 어떤 생각? 나는 Ruby on Rails API을 읽었지만 아무것도 볼 수 없다.

답변

1

위 코드를 게시 해 보았습니다. 제대로 작동했습니다.

class User < ActiveRecord::Base 
    validate :date_is_correct_format 

    def date_is_correct_format 
     validates_with DateFormatValidator 
    end 
    end 

    class DateFormatValidator < ActiveModel::Validator 
    def validate(record) 
     record.errors[:transaction_date] << "Date must be in the following format: mm/dd/yyyy" unless /\d{2}\/\d{2}\/\d{4}/.match(record.transaction_date) 
    end 
    end 

그런 다음 내가 콘솔에서 시도, 출력은 다음과 같습니다

[1] pry(main)> User.create!(:transaction_date=>'fdsf') 
    (0.1ms) begin transaction 
    (0.1ms) rollback transaction 
    ActiveRecord::RecordInvalid: Validation failed: Transaction date Date must be in the following  format: mm/dd/yyyy 
    from /Users/zuozuo/.rvm/gems/[email protected]/gems/activerecord- 4.0.0/lib/active_record/validations.rb:57:in `save!' 

그래서 당신은 레일의 어떤 버전을 사용합니까?

또는 당신이 시도 할 수 있습니다 :

class User < ActiveRecord::Base 
    validates_with ::DateFormatValidator 
    end 

이 또한 구현 작동합니다.

+0

나는 레일 3.2.12를 달리고있다. 나는 그것이 잘될 거라 생각했다. 나는 sidekiq 직원과 함께 유니콘 서버에서 실행 중입니다. 하지만 시도 할 때마다 다시 시작합니다. – TheLegend

+0

'validates_with :: DateFormatValidator'에는':: '이 필요합니다. – TheLegend

+0

'::'은 필요하지 않습니다. – zuozuo