datetimepickerの値検証
個人的には値の検証なんて不要だと思っていたけど、日時型を無視して入力する事例が稀に発生したりする。どうやっているんだろう?
普通はモデルのvalidatesで済むけど、日時+時限で値調整をコントローラーで行っているのでたちが悪い。そんなコードを書いたのは俺。
#呼び出す所 if datetime_chk(params[:rental][:rtning]) rtn_time = get_jigen_time(params[:rental][:rtning_time].to_i, 1) mk = params[:rental][:rtning].to_time params[:rental][:rtning] = Time.mktime(mk.year, mk.month, mk.day, rtn_time[0].to_i, rtn_time[1].to_i).strftime("%Y-%m-%d %H:%M") else params[:rental][:rtning]=Time.now.strftime("%Y-%m-%d %H:%M") end
#値チェック #valid_timeが使えなかったのでこんな書き方になった。 def datetime_chk(str) return false if str.blank? dt = str.split(" ") return false if dt[1].blank? dtd=dt[0].split("-").map(&:to_i) #dtt=dt[1].split(":").map(&:to_i) unless Date.valid_date?(dtd[0], dtd[1], dtd[2]) p "date",dtd return false end unless dt[1] =~ /^([0-1][0-9]|[2][0-3]):[0-5][0-9]$/ p "time", dt[1] return false end =begin unless Date.valid_time?(dtt[0], dtt[1]) p "time",dtt return false end =end return true end
まとめると
# Datetime型のチェック def datetime_chk(str) return false if str.blank? dt = str.split(" ") return false if dt[1].blank? dtd=dt[0].split("-").map(&:to_i) return false unless dtd.length==3 return false unless Date.valid_date?(dtd[0], dtd[1], dtd[2]) # valid_timeが使えないから代替策 return false unless dt[1] =~ /^([0-1][0-9]|[2][0-3]):[0-5][0-9]$/ return true end
よくよく考えると日時型なんだけど日付の妥当性だけチェックすれば良いことなってきたので
def date_chk(str) return false if str.blank? dt = str.split(" ") dtd=dt[0].split("-").map(&:to_i) return false unless dtd.length==3 return false unless Date.valid_date?(dtd[0], dtd[1], dtd[2]) return true end