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