복붙노트

[RUBY-ON-RAILS] 어떻게 레일에서 날짜를 확인합니까?

RUBY-ON-RAILS

어떻게 레일에서 날짜를 확인합니까?

내가 루비 레일에 내 모델의 날짜를 확인하고자하지만, 일, 월, 연도 값은 이미 그들이 내 모델에 도달하는 시간에 의해 잘못된 날짜로 변환됩니다.

내가보기에 2009 2월 31일 입력하면 내가 Model.new (PARAMS [: 모델])을 사용하는 경우 예를 들어, 내 컨트롤러, 그것은 나의 모델은 다음 유효한 날짜로 본다 "2009년 3월 3일"로 변환 어떤 이는이지만, 그것은 잘못된 것입니다.

내 모델이 검증을 할 수 있도록하고 싶습니다. 내가 할 수있는, 또는 내가이 완전히 잘못에 대해 갈거야 그 방법이 있습니까?

나는 문제에 대해 설명이 "날짜 확인"을 발견하지만 결코 해결되지 않았다.

해결법

  1. ==============================

    1.난 당신이 날짜에 대한 태그를 생성하는 date_select 도우미를 사용하고 추측하고 있습니다. 당신이 그것을 할 수있는 또 다른 방법은 일, 월, 년 필드 선택 폼 헬퍼를 사용하는 것입니다. 이처럼 (내가 사용 예제 created_at 날짜 필드) :

    난 당신이 날짜에 대한 태그를 생성하는 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.
    
  2. ==============================

    2.만성 보석을 사용하여 :

    만성 보석을 사용하여 :

    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
    
  3. ==============================

    3.당신이 원하는 경우 레일 3 루비 1.9 호환성은 date_validator 보석을 시도해보십시오.

    당신이 원하는 경우 레일 3 루비 1.9 호환성은 date_validator 보석을 시도해보십시오.

  4. ==============================

    4.액티브 레코드는 타입 캐스팅하기 전에 원시 속성 데이터를 포함하는 속성 _before_type_cast을 제공합니다. 이 전 배역 값과 오류 메시지를 반환하거나 배역 후 불가능 검증을 수행하는 데 유용 할 수 있습니다.

    액티브 레코드는 타입 캐스팅하기 전에 원시 속성 데이터를 포함하는 속성 _before_type_cast을 제공합니다. 이 전 배역 값과 오류 메시지를 반환하거나 배역 후 불가능 검증을 수행하는 데 유용 할 수 있습니다.

    접근 유효성 검사를 수행하는 것은 약간 접근 계약을 변경하기 때문에 나는 접근을 재정의 다니엘 폰 Fange의 제안에서 멀리 부끄러워 것입니다. 액티브 레코드는이 상황에 대해 명시 적으로 기능이 있습니다. 그걸 써.

  5. ==============================

    5.이 모델의 날짜로 변환되기 전에 날짜 문자열을 처리해야하기 때문에, 그 필드에 대한 접근을 무시할 것

    이 모델의 날짜로 변환되기 전에 날짜 문자열을 처리해야하기 때문에, 그 필드에 대한 접근을 무시할 것

    하자 당신의 날짜 필드가 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
    
  6. ==============================

    6.A는 후반 여기 비트,하지만 덕분에 "어떻게 레일에서 날짜를 확인합니까?" 나는이 유효성 검사기를 작성 관리, 희망은 누군가에게 유용합니다 :

    A는 후반 여기 비트,하지만 덕분에 "어떻게 레일에서 날짜를 확인합니까?" 나는이 유효성 검사기를 작성 관리, 희망은 누군가에게 유용합니다 :

    당신의 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
    
  7. ==============================

    7.여기에 비 만성 대답이다 ..

    여기에 비 만성 대답이다 ..

    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
    
  8. ==============================

    8.(사용자 정의 선택을 사용하는 경우 PARAMS에 액세스 할 수있는 컨트롤러의 메소드의 어딘가에서) 당신은 너무 같은 날짜와 시간을 확인할 수 ...

    (사용자 정의 선택을 사용하는 경우 PARAMS에 액세스 할 수있는 컨트롤러의 메소드의 어딘가에서) 당신은 너무 같은 날짜와 시간을 확인할 수 ...

    # Set parameters
    year = params[:date][:year].to_i
    month = params[:date][:month].to_i
    mday = params[:date][:mday].to_i
    hour = params[:date][:hour].to_i
    minute = params[:date][:minute].to_i
    
    # Validate date, time and hour
    valid_date    = Date.valid_date? year, month, mday
    valid_hour    = (0..23).to_a.include? hour
    valid_minute  = (0..59).to_a.include? minute
    valid_time    = valid_hour && valid_minute
    
    # Check if parameters are valid and generate appropriate date
    if valid_date && valid_time
      second = 0
      offset = '0'
      DateTime.civil(year, month, mday, hour, minute, second, offset)
    else
      # Some fallback if you want like ...
      DateTime.current.utc
    end
    
  9. ==============================

    9.당신은 validates_date_time 플러그인을 시도 해 봤나?

    당신은 validates_date_time 플러그인을 시도 해 봤나?

  10. from https://stackoverflow.com/questions/597328/how-do-i-validate-a-date-in-rails by cc-by-sa and MIT license