2015-01-05 2 views
2

날짜 기록 필드가 내 ActiveRecord 모델 (레일)에 있고 date fieid가 범위를 벗어 났을 때 내 모델을 충돌로부터 보호해야합니다.ActiveRecord : 값이 유효하지 않은 경우 datetime 구문 분석을 중단합니다.

나는 this 질문을 발견하고 유사하게 만들려고 :

irb(main):007:0> Something.new(important_date: "2015-20-40").valid? 
ArgumentError: argument out of range 
    from /home/shau-kote/.gem/ruby/2.1.0/gems/activesupport-4.2.0/lib/active_support/values/time_zone.rb:350:in `initialize' 
    from /home/shau-kote/.gem/ruby/2.1.0/gems/activesupport-4.2.0/lib/active_support/values/time_zone.rb:350:in `new' 
    from /home/shau-kote/.gem/ruby/2.1.0/gems/activesupport-4.2.0/lib/active_support/values/time_zone.rb:350:in `parse' 
    ... 
: 또한 Valie이 범위를 벗어날 경우

class Something < ActiveRecord::Base 
    validate :important_date_is_valid_datetime, on: :create 
    validates :important_date, presence: true 

private 

    def important_date_is_valid_datetime 
     if (DateTime.parse(important_date.to_s()) rescue ArgumentError) == ArgumentError then 
      errors.add(:important_date, 'must be a valid datetime') 
     end 
    end 

end 

이 코드는하지만 필드 구문 분석을 '검증'날짜 필드를 중단하지 않는 수

비슷한 충돌을 예방할 수 있습니까?

답변

3

이것은 레일 레이스 4에서 발리 데이터가 호출되기 전에 예외가 발생하는 문제입니다. pull request은 레일즈 3의 잘못된 날짜가 단지 nil 인 동작을 되살려줍니다. 이 풀 요청은 병합 된 것으로 보이므로 Rails 버전을 업데이트하면 이미 문제가 해결 될 수 있습니다.

그 동안 나는 두 가지 대안을 생각해 볼 수 있습니다. 첫째, 원하는 경우 클라이언트 측 유효성 검사를 사용할 수 있지만 물론 사용자를 "선의"로 사용하고 두 번째로는 사용자를 보호 할 수 있습니다. 유효성 검사를 사용하면 매개 변수가 datetime 특성을 설정하기 전에 컨트롤러에서 유효한 날짜 (또는 ArgumentError 각각)를 확인할 수 있습니다. 두 가지 옵션 모두 최적은 아니지만 더 많은 충돌을 방지해야합니다.

+0

필자에게는 최신 보석 레일 4.2.0이 있으며 지금까지이 문제가 있습니다. 매우 불쾌한 일이지만 "두 번째 해결 방법"은 제 프로젝트에 아주 잘 들어 맞습니다. 고맙습니다. –

관련 문제