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