#はじめに
railsでのWEBアプリ開発中において、日付関係の取り扱いで悩んだのでその備忘録です。
#やりたいこと
htmlのinputタグには**type = "date"**が指定できます。
この機能をそのまま利用して入力フォームを作成します。
この属性は、特殊な日付選択インターフェイスを使用して、ユーザーに日付を入力させる入力フィールドを生成します。結果の値には年、月、日が含まれますが、時刻は含まれません。
ブラウザによってインターフェースはまちまちです。
inputタグ
Androidのchoromeでは以下の画像のように表示されます。
下手に自分でフォームを作るより、ユーザビリティが高いなーと思います。
Ruby strftimrメソッドで表示するフォーマットを整える
Rubyのstrftimeメソッドは、日付や日時のデータを編集して文字列に変換するためのメソッドです。
例として、”2019-12-27 16:04:05”といった日時データを”12/27”だけ表記したい場合があります。
むしろ時刻で秒単位まで表示する必要がある時のほうが少ないのではと感じます。
strftimeメソッドは上記のようなフォーマットを整えるとき使用すると便利です。
##【問題点】datetime型とdate属性の相性が悪い
inputタグ属性dateを使用するメリットとstrftimeメソッドの利便性は理解いただけたでしょうか。
この二つを組み合わせるときに以下の制約が邪魔します。
1. inputタグ属性dateは日付しか入力できない
2. strftimeメソッドは日付・時刻どちらかがNULLだと使用できない
- 付随して、strftimeメソッドを使用し参照できるテーブルのカラム型はdatetimeである必要がある
まとめると、inputタグ属性dateでそのまま保存しても、strftimeメソッドは使用することができません。
##【解決策】いったん置き換える
to_datetimeメソッド
date型をdatetime型に置き換えてくれます。この時設定されていない時刻のデータには0が置き換えられます。
手順
- inputタグ属性dateでとりあえずdatetime型のカラムにデータを保存する。
- カラムのデータをto_datetimeメソッドを用いてNULLを0に置き換える。
- strftimeメソッドでフォーマットを整えて表示する。
以上のプロセスでエラーを吐くことなく実行することができました。
## 実際の処理
フォーム
<!-- 日付 -->
<div class ="input-date">
<input name="date" type="date" />
</div>
コントローラにて入力フォームからの値の受け取り
@homework_post = Hindext.new(deadline:params[:date])
@homework_post.save
viewでおきかえ(本来コントローラで行うべき処理ですが都合上viewファイルで行っています。)
<!-- 日付 -->
<% date = index.deadline %>
<% dated = date.to_datetime %>
<%= dated.strftime('%m/%d') %>
問題なく動作しました。
#まとめ
いろいろ壁があって疲れるにゃ