私は現在、フィヨルドブートキャンプにて未経験からプログラミング学習をしているものになります。
この記事は、自分自身が学習したことをまとめ、アウトプットすることを目的として書いていますので、間違いがある可能性がありますのでご注意ください。
理由: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
を変更すれば全て表記が変わります。