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/Rails] strftimeのよく使うテンプレート

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833 コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。 これまでにRuby on Rails チュートリアル第2版の監修および半分程度を翻訳、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れて更新翻訳中。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 実は最近Go言語が好きで、Goで書かれたRubyライクなGoby言語のメンテナーでもある。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

BPSアドベントカレンダー

週刊Railsウォッチ