Twitterをよく見ると、ツイートした時間の表示は○○前とか約○○時間前みたいなかなりアバウトな時間表示になっています。Ruby on Railsではago_ago_in_wordsメソッドを使うことで簡単に実装することができます。ここではその使い方について。

ヘルパーに追加

Viewでこの関数を使うときに、直接、Viewに書いてしまうのは、見た目とロジックの分離という視点で、MVCの考え方の上ではあまりよろしくないので、helperに書きましょう。全てのViewで使いたいときはapp/helper/application_helper.rbに書けばいいと思います。

def date_format(datetime)
    time_ago_in_words(datetime) + '前'
end

これで、Viewの中で<%= datetime(post.created_at) %>みたいに読み込んでやると、今からどのくらい前かを表示することができます。

ただ、このままだと、”2days前”みたいな喧嘩売ってるとしか思えないような表記になるので、日本語化してやりましょう。

言語の設定

まず、このアプリケーションで使用する言語を選択します。ここでは日本語を選択しようと思うのでconfig/application.rbの中に以下のような文を書き込みましょう。たぶん、この部分は最初:deの状態でコメントアウトされていると思います。

config.i18n.default_locale = :ja

次に、日本語の翻訳ファイルを作成します。翻訳用のファイルはconfig/localesの中に入っています。その中にja.ymlを作成して、

ja:
  datetime:
    distance_in_words:
      half_a_minute: "30秒前後"
      less_than_x_seconds:
        one:   "1秒"
        other: "%{count}秒"
      x_seconds:
        one:   "1秒"
        other: "%{count}秒"
      less_than_x_minutes:
        one:   "1分"
        other: "%{count}分"
      about_x_hours:
        one:   "約1時間"
        other: "約%{count}時間"
      x_days:
        one:   "1日"
        other: "%{count}日"
      about_x_months:
        one:   "約1ヶ月"
        other: "約%{count}ヶ月"
      x_months:
        one:   "1ヶ月"
        other: "%{count}ヶ月"
      about_x_years:
        one:   "約1年"
        other: "約%{count}年"
      over_x_years:
        one:   "1年以上"
        other: "%{count}年以上"

という風に書き込んでやりましょう。そうすれば、約1時間前みたいな感じの表記になると思います。

まとめ

基幹システムとかじゃない限り、正直、正確な時間が必要なときなんてめったにないですよね。更新頻度が高いサービスとかの場合だと、どのくらい前なのか、とかのほうがパッと把握できる有意義な情報です。そういう○○前という情報をパッと書けるのはありがたいです。