Code Journey

30代未経験からプログラミング挑戦中(追うものは追われる者に勝る)

Railsで日時をフォーマットする場合strftimeよりもlメソッドがベター

私は現在、フィヨルドブートキャンプにて未経験からプログラミング学習をしているものになります。

この記事は、自分自身が学習したことをまとめ、アウトプットすることを目的として書いていますので、間違いがある可能性がありますのでご注意ください。

理由:DRYなコードを書くことができるから

フィヨルドブートキャンプの課題で、本管理のRailsアプリにコメント機能を追加する課題に取り組みました。

その中で、登録したデータから投稿日を画面上に表示させる必要がありました。


その際、created_atを引っ張ってきて、表示を整えるためにstrftimeメソッドと正規表現を使って表示を調整していましたがこれだと、「日報の投稿日」「コメントの投稿日」と何度も同じ記述が必要になってしまいます。


いわゆるDRY(Don't Repeat Yourself)の原則に則っていないコードになってしまいます。

課題のレベルだと2箇所の重複ですが、規模の大きいアプリだとコードの記述量が多くなり、管理していく上でもよろしくありません。

以下のフィヨルドのメンターでもある伊藤さんのQiitaの記事で「Railsで日時をフォーマットするときはstrftimeよりも、lメソッドを使おう」

という記事を発見し、今回の記述の問題に気づかせてもらい、コードを修正しました。自分の中で忘れないようにアウトプットしておきたいと思います。

修正前のコード

これまで日報とコメントの投稿時間の表示を以下のようにしていました。

修正前

<%= report.created_at.strftime('[%Y年%m月%d日 %H時%M分に投稿]')

このようなコードでも表示上は問題ありません。

しかし先述したようにDRYなコードではないので修正が必要です。

修正後のコード

view側の標記

<p><%= l comment.created_at, format: :post_time %></p>

このように修正すればXXXXX.created_atにlメソッドをつけるだけで表示することができます。 formatはさらに表示を変更する際に指定します。

以下で説明します。

lメソッドを使う上での注意点

タイムゾーンを日本時間に変更する

config/application.rbでデフォルトのロケールを日本(ja)に設定しないと、世界標準時間が表示されてしまいます

module TimeFormatSandbox
  class Application < Rails::Application

    # デフォルトのロケールを日本(ja)に設定
    config.i18n.default_locale = :ja
  end
end

表示を用途に合わせて設定する

<%= l report.created_at %>

だと表記がcreate_atのデータがそのまま表示されることになります。

そして標記が読みにくいのでlocales/ja.ymlに好みの表示を設定します。

i18n_generatorsを使っていれば

 time:
    am: 午前
    formats:
      default: "%Y年%m月%d日(%a) %H時%M分%S秒 %z"
      long: "%Y/%m/%d %H:%M"
      short: "%m/%d %H:%M"

ここまではすでに設定されています。必要に応じて変更を加えてから、formatで指定すれば変換されます。 なければファイルを作成し、記述します。

 time:
    am: 午前
    formats:
      default: "%Y年%m月%d日(%a) %H時%M分%S秒 %z"
      long: "%Y/%m/%d %H:%M"
      short: "%m/%d %H:%M"
      post_time: "[%Y年%m月%d日 %H時%M分に投稿]" # ここ

view側の標記

<%= l report.created_at, format: :post_time %>

これでDRYの原則に則ったコードになりました。また、表示を変更する際もja.ymlを変更すれば全て表記が変わります。