はじめに
タスク管理アプリを作成する際、日付と時間を入力するため、datetime_fieldを使用した。
しかし、表記にすると謎の+0900が後付けされるわ、Rspecテストでこの場合どうやって入力値を打ち込むんだ? と混乱した経緯があったので、調べて試してみた。
※Railsに触り始めて1ヶ月ほどほどぐらいの健忘録みたいなものです。生優しい目でご覧ください。
開発環境
Rails 6.1.7.4
ruby 3.0.1
+0900の数字は何?
UTC(協定世界時)、世界各地の標準時を決める基準。日本の標準時は、UTCより9時間進んでいるため、+0900と表示される。
datetime_fieldで取得した情報をそのまま表示すると下記のようになる。
正直、この状態になるまで気にしたこともなかった(自分は)ぐらいなので、普段どれぐらいの人が気にしているかわからないこの表記はしなくてもいいだろう・・・と結論に至る。
表示変換方法
- strftimeメソッド
公式リファレンス
strftime(format) -> String
時刻を format 文字列に従って文字列に変換した結果を返します。
今回は例としてタスク管理の終了期限を表示させるものとしています。
表示を変えたいデータ.strftime(させたい表示形式)
task.end_time.strftime('%Y-%m-%d %H:%M:%S')
上記だと、%Y(西暦),%m(月2桁),%d(日2桁),
%H(時 24時間表記),%M(分2桁),%S(秒2桁)となる。
しかし、これだと表記毎に後付けしないといけない!
そうだ、メソッド化しよう。Don't Repeat Yourselfだ!(小並感)
- メソッド化(最初に言っておきますが、全然DRYになってなかった)
format_datetimeというメソッドを定義
app/helpers/application_helper.rb
module ApplicationHelper
def format_datetime(datetime)
datetime.strftime('%Y-%m-%d %H:%M:%S')
end
end
実際に使用してみる ()内に変換したいデータ名
format_datetime(end_time)
helper含めたら記述量ふえてませんか?(思わず自分に聞いてしまった) YES!
失敗から模索
他にいい方法はないか?(楽できないか)と更に模索。
I18nのpublic APIというものを発見する。ちなみに下記記述前提です。
- 日本語化前提
日本語化方法はこの記事の本質じゃないので、記述のみで説明は割愛します。
app/config/locales/ja.yaml
time:
am: 午前
formats:
default: "%Y年%m月%d日(%a) %H時%M分%S秒 %z"
long: "%Y/%m/%d %H:%M"
short: "%m/%d %H:%M"
app/config/initializers/locale.rb
I18n.config.available_locales = :ja
I18n.default_locale = :ja
app/config/application.rb
config.time_zone = 'Tokyo'
救世主 lメソッド
- l メソッド
Railsガイドより
I18n APIで最も重要なメソッドを以下に示します。
localize # DateオブジェクトやTimeオブジェクトを現地のフォーマットに変換する
lはlocalizeの略のようです。
このメソッドを利用すると・・・
<%= l task.end_time %>
かなりの簡略化ができている!
結局事前準備や記述多いよね?って思ったそこのあなた!
もともと日本語対応させるために必要だった記述なので、無駄な記述を増やした訳でないのですよ(現状) 自分でメソッド化したの無駄って言っちゃったよ。。。
ちなみに
"%Y年%m月%d日(%a) %H時%M分%S秒 %z"
%zがタイムゾーンなので、それを削除すれば+0900が非表示になります!
Rspecテストでの記述方法
もう一つ沼りかけたので記載
datetime_fieldを使用すると、こんな感じの入力になります。
これテストの時どう記述するの? ぽちぽちするからclickとか使うのか??と自力で色々試しても通過せず。色々調べて下記記述に落ち着きました。
テストにfill_inで記述する場合
fill_in "入力欄タイトルとか", with: '設定したい時間'
fill_in "終了期限", with: '002023-09-01T00:00'
FactoryBotに記述する場合
カラム名 {'設定したい時間'}
end_time { '002023-8-15T00:00'}
00が頭に必要ということと、時間表記の前にTが必要でした。
そりゃ通らないわ。
まとめ
こうゆうのがあったら便利だな、と思うメソッドなどは大体存在しているという言葉を、今回の結果で思い出す。知らないことは知らないんだから、どんどん探して、使ってみて、吸収していきたいと思う。