[ruby-on-rails] Rails에서 날짜를 어떻게 확인합니까?

Ruby on Rails에서 모델의 날짜를 확인하고 싶지만 일, 월, 연도 값이 모델에 도달 할 때 이미 잘못된 날짜로 변환되었습니다.

예를 들어, 내보기에 2009 년 2 월 31 일을 입력하면 Model.new(params[:model])컨트롤러에서 사용할 때 “2009 년 3 월 3 일”로 변환됩니다. 그러면 내 모델이 유효한 날짜로 간주되지만 정확하지 않습니다.

내 모델에서이 유효성 검사를 수행하고 싶습니다. 내가 할 수있는 방법이 있습니까? 아니면 완전히 잘못된 것입니까?

문제를 설명하는 ” 날짜 유효성 검사 “를 찾았 지만 해결되지 않았습니다.



답변

date_select도우미를 사용 하여 날짜에 대한 태그를 생성하고 있다고 생각합니다 . 할 수있는 또 다른 방법은 일, 월, 연도 필드에 대한 선택 양식 도우미를 사용하는 것입니다. 다음과 같이 (내가 사용한 예는 created_at 날짜 필드입니다) :

<%= f.select :month, (1..12).to_a, selected: @user.created_at.month %>
<%= f.select :day, (1..31).to_a, selected: @user.created_at.day %>
<%= f.select :year, ((Time.now.year - 20)..Time.now.year).to_a, selected: @user.created_at.year %>

그리고 모델에서 날짜를 확인합니다.

attr_accessor :month, :day, :year
validate :validate_created_at

private

def convert_created_at
  begin
    self.created_at = Date.civil(self.year.to_i, self.month.to_i, self.day.to_i)
  rescue ArgumentError
    false
  end
end

def validate_created_at
  errors.add("Created at date", "is invalid.") unless convert_created_at
end

플러그인 솔루션을 찾고 있다면 validates_timeliness 플러그인을 확인 하겠습니다 . 다음과 같이 작동합니다 (github 페이지에서).

class Person < ActiveRecord::Base
  validates_date :date_of_birth, on_or_before: lambda { Date.current }
  # or
  validates :date_of_birth, timeliness: { on_or_before: lambda { Date.current }, type: :date }
end 

사용 가능한 유효성 검사 방법 목록은 다음과 같습니다.

validates_date     - validate value as date
validates_time     - validate value as time only i.e. '12:20pm'
validates_datetime - validate value as a full date and time
validates          - use the :timeliness key and set the type in the hash.


답변

만성 보석 사용 :

class MyModel < ActiveRecord::Base
  validate :valid_date?

  def valid_date?
    unless Chronic.parse(from_date)
      errors.add(:from_date, "is missing or invalid")
    end
  end

end


답변

Rails 3 또는 Ruby 1.9 호환성을 원한다면 date_validator gem을 사용 해보세요 .


답변

Active Record는 _before_type_cast타입 캐스팅 전에 원시 속성 데이터를 포함하는 속성을 제공합니다 . 이는 사전 형변환 값이있는 오류 메시지를 반환하거나 형변환 후 불가능한 유효성 검사를 수행하는 데 유용 할 수 있습니다.

접근 자에서 유효성 검사를 수행하면 접근 자 계약이 약간 변경되기 때문에 Daniel Von Fange의 접근 자 재정의 제안을 피할 것입니다. Active Record에는 이러한 상황에 대한 명시적인 기능이 있습니다. 그걸 써.


답변

모델에서 날짜로 변환되기 전에 날짜 문자열을 처리해야하므로 해당 필드에 대한 접근자를 재정의합니다.

날짜 필드가 published_date. 이것을 모델 객체에 추가하십시오.

def published_date=(value)
    # do sanity checking here
    # then hand it back to rails to convert and store
    self.write_attribute(:published_date, value)
end


답변

조금 늦었지만 ” 레일에서 날짜를 어떻게 확인합니까? ” 덕분 에이 유효성 검사기를 작성할 수 있었으므로 희망이 누군가에게 유용합니다.

당신의 내부 model.rb

validate :date_field_must_be_a_date_or_blank

# If your field is called :date_field, use :date_field_before_type_cast
def date_field_must_be_a_date_or_blank
  date_field_before_type_cast.to_date
rescue ArgumentError
  errors.add(:birthday, :invalid)
end


답변

다음은 비만 성적인 대답입니다 ..

class Pimping < ActiveRecord::Base

validate :valid_date?

def valid_date?
  if scheduled_on.present?
    unless scheduled_on.is_a?(Time)
      errors.add(:scheduled_on, "Is an invalid date.")
    end
  end
end