Rubyで、渡ってきた文字列が正当なdateである場合だけtrue
を返し、その他の場合はfalse
を返すvalidatorを作りました。
Ruby on Railsなどで活用できると思われます。というかRailsで使うために作りました。
gemとかがオーバーキルっぽい時に。
require 'date'
# 日付のvalidationを行う関数
# strに不正な文字列や文字列以外が渡ってきた場合rescueが動き、
# 不正な日付(2016-2-31など)が渡ってきた場合
# Date.valid_date?でfalseが返る
private def date_valid?(str)
begin
y, m, d = str.split("-").map(&:to_i)
return Date.valid_date?(y, m, d)
rescue
return false
end
end
追記
コメント欄でのご指摘を受け、次のようなコードにしてみました。
require 'date'
private def date_valid?(str)
!! Date.parse(str) rescue false
end
こうすることで、様々な日付フォーマットを受け入れられるようになりました。
また、trueオブジェクトに!!
をかけることで、true
が返ってくるのも勉強になりました。
ありがとうございます。
!! object #=> true_objectの場合true、false_objectの場合falseになる仕組み
まず、! object
が評価され、objectをtrue
かfalse
に変換してしまいます。
今回返ってくることが期待されているDateオブジェクトはtrueオブジェクトなので、ここでfalse
が返り、そして更に!
をかけることでtrue
が返るようになります。
もし、期待されていないNilオブジェクトが返ってきた場合、Nilオブジェクトはfalseオブジェクトなのでtrue
が返り、更に!
をかけるとfalse
になります。