Rails5 で日付のバリデーションを行う
Ruby Ruby on Rails
Published: 2019-05-09

やったこと

Rails5 で日付、日時をフォーマットする方法を調べます。

確認環境

$ ruby --version
ruby 2.6.2p47 (2019-03-13 revision 67232) [x86_64-darwin17]

$ rails --version
Rails 5.2.3

調査

やったこと

Rails5 ではデフォルトで日付のバリデーションがないようなので、実装方法を調べました。

task.expire_date という タスクの有効期限について、日付のバリデーションをかけます。

調査

app/models/task.rb

class Task < ApplicationRecord
  validate :expire_date_is_valid?

  private
  def expire_date_is_valid?
    begin
      Date.parse self.expire_date.to_s if self.expire_date.present?
    rescue ArgumentError
      errors.add(
        :expire_date,
        '無効な日付です'
      )
    end
  end
end

Date.parse の挙動も試してみました。

$ rails c

irb(main):001:0> Date.parse(888)
Traceback (most recent call last):
        2: from (irb):1
        1: from (irb):1:in `parse'
TypeError (no implicit conversion of Integer into String)
irb(main):002:0> Date.parse('20190509')
=> Thu, 09 May 2019
irb(main):003:0> Date.parse('2019-05-09')
=> Thu, 09 May 2019
irb(main):004:0> Date.parse('19-05-09')
=> Thu, 09 May 2019
irb(main):005:0> Date.parse('9919-05-09')
=> Fri, 09 May 9919
irb(main):006:0> Date.parse('11')
=> Sat, 11 May 2019

これをみると、厳密なチェックは出来ていないので、使用するときは注意してください。

参考