日付型が正しいか確認する

面倒で仕方ない。
まだ試行錯誤中だけど

  def date_check?(value)
    #日付型が正しいか確認
    # value は 「yyyy-mm-dd」 
    #正しくないならFALSE
    return false if value.blank?    
    value_split = value.to_s.split(" ")
    return false if value_split.length != 1
    
    value_split[0].split("-").each{|val|
      return false if val.length != val.to_i.to_s.length
      arr.push(val.to_i)
      }
    #arr = value_split[0].split("-").map(&:to_i)
    return false if arr.length != 3
    return false unless Date.valid_date?(arr[0], arr[1], arr[2])
    return true
  end

これだと012月はNGで合っているけれど01月もNGになる。だめだめ。

修正版

  def date_check?(value)
    #日付型が正しいか確認
    # value は 「yyyy-mm-dd」 
    #正しくないならFALSE
    # 空白
    return false if value.blank?
    value_split = value.to_s.split(" ")
    # 空白区切りで1個以上あるのはダメ
    return false if value_split.length != 1
    d = value_split[0].split("-")
    # 日付は3個ある
    return false if d.length != 3
    # 複雑な計算するよりも配列作っちゃう。
    chk = ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"]
    # チェック配列に含まれている
    return false unless chk.include?(d[1])
    # チェック配列を月から日に拡大
    for num in 13..31
      chk.push(num.to_s)
    end
    return false unless chk.include?(d[2])
    # 数値型に変換
    d.map!(&:to_i)
    # やっと日付確認をする
    return false unless Date.valid_date?(d[0], d[1], d[2])
    return true
  end