Tech Racho エンジニアの「?」を「!」に。
  • 開発

Rails: ビューでstrftimeを直書きするのはたぶんよくない(翻訳)

概要

原著者の許諾を得て翻訳・公開いたします。

Rails: ビューでstrftimeを使うとよくない場合がある(翻訳)

strftimeメソッドはさまざまな言語にありますが、いずれもC言語が由来です。書式を指定する引数の(ほとんど暗号のような)構文は長年変わっておらず、驚くほど多くの言語で一貫しています。

Rubyのstrftimeの書式はTimeクラスで網羅されています。

ただし、strftimeをビューで使うと動作が一貫せず混乱する可能性が高まります。

以下のように書くのではなく

ビューで日付や時刻の書式をstrftimeで設定する。

<%= @user.last_signed_in_at.strftime("%m-%e-%y %H:%M") %>

以下のように書く

日付や時刻の書式はRailsの組み込みメソッドで設定する。

つまり私がやったようにDateTimeで独自の: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形式の日付文字列を得られます。

DateTimeがデフォルトで提供するフォーマットは私には到底覚えられませんし、そもそもドキュメントがめったに見当たりません。そこで、RailsのDateTimeフォーマットをスペルアウトする以下のサイトを自分でこしらえました。

そうしない理由があるとすれば

ビューでstrftimeを呼び出しても実際のパフォーマンスは低下しません。この記事の方法は一貫性と整理のためのものです。

訳注

以下の記事ではDATE_FORMATS[:default]は改変しない方がよいと指摘されています。なお上の記事は改変ではなく独自の:stampを追加しています。

また同記事では、I18nを使う方法も紹介されています。

おたより発掘

関連記事

Ruby: strftimeでよく使うテンプレート


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。