日付型が正しいか確認する
面倒で仕方ない。
まだ試行錯誤中だけど
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