概要
原著者の許諾を得て翻訳・公開いたします。
- 英語記事: Using strftime in a Rails view is probably a mistake - Andy Croll
- 原文公開日: 2019/07/14
- 著者: Andy Croll
Rails: ビューでstrftimeを使うとよくない場合がある(翻訳)
strftime
メソッドはさまざまな言語にありますが、いずれもC言語が由来です。書式を指定する引数の(ほとんど暗号のような)構文は長年変わっておらず、驚くほど多くの言語で一貫しています。
Rubyのstrftime
の書式はTime
クラスで網羅されています。
ただし、strftime
をビューで使うと動作が一貫せず混乱する可能性が高まります。
以下のように書くのではなく
ビューで日付や時刻の書式をstrftime
で設定する。
<%= @user.last_signed_in_at.strftime("%m-%e-%y %H:%M") %>
以下のように書く
日付や時刻の書式はRailsの組み込みメソッドで設定する。
つまり私がやったようにDate
やTime
で独自の:stamp
フォーマットを作成する。
config/initializers/time_formats.rb
Date::DATE_FORMATS[:stamp] = "%Y%m%d" # YYYYMMDD
Time::DATE_FORMATS[:stamp] = "%Y%m%d%H%M%S" # YYYYMMDDHHMMSS
続いてビューで以下のように書く。
<%= @user.last_signed_in_at.to_s(:stamp) %>
そうする理由
引数がややこしくて間違えそうになるメソッドをビューに直書きすると、一貫性が落ちる原因になります。
日付や時刻の書式をアプリケーショングローバルに定義する主なメリットは、後から参加する開発者(未来の自分も含む)が助かることです。これによって、現在時刻の表現方法を事前に少数の方法にまとめてアプリケーション全体で一貫させることができます。今後参加する開発者も独自のフォーマットを構築できます。
表記が一貫することで、アプリケーションのユーザーもメリットを得られます。日付や時刻が常に同じ方法で表現されれば、ユーザーが日付や時刻を読み解く手間も削減されます。「11 Jun」ではなく常に「Jun 11」で統一するのは一見些細なことではありますが、手間をかける価値があります。
自分の欲しい日付フォーマットをずばり見つけられる便利なサイトもいろいろありますので、ここでいくつかご紹介します。
strftime
のフォーマット文字列をビジュアル表示で気持ちよく参照できます。アプリケーション全体で使える実際のデータ形式を生成できます。
実際の文字列で表現された日付や時刻をコピペすると、その文字列の書式を設定できるstrftime
形式の日付文字列を得られます。
Date
やTime
がデフォルトで提供するフォーマットは私には到底覚えられませんし、そもそもドキュメントがめったに見当たりません。そこで、RailsのDate
やTime
フォーマットをスペルアウトする以下のサイトを自分でこしらえました。
そうしない理由があるとすれば
ビューでstrftime
を呼び出しても実際のパフォーマンスは低下しません。この記事の方法は一貫性と整理のためのものです。
訳注
以下の記事ではDATE_FORMATS[:default]
は改変しない方がよいと指摘されています。なお上の記事は改変ではなく独自の:stamp
を追加しています。
また同記事では、I18nを使う方法も紹介されています。
localeに足すのもアリだな (localeまともに使ったことなし) https://t.co/yHp88Cfkia
— うなすけ (@yu_suke1994) December 18, 2018
おたより発掘
イトウサンモ、ニタヨウナキジカイテルヨー。イトウサンノオススメはl(I18n.l)メソッドダヨー。
【初心者向け・動画付き】Railsで日時をフォーマットするときはstrftimeよりも、lメソッドを使おう - Qiita https://t.co/app3dGb6zq https://t.co/IfFplzg7dk
— Junichi Ito (伊藤淳一) (@jnchito) November 22, 2019