Railsの開発を進める中で、lメソッドを用いた際に、以下のようなエラーが発生したので、その原因と解決について記載したいと思います。
ちなみにI18nやlメソッドの詳しい利用方法に関しては、参考URLをご覧ください。
結論 ≒ 原因
このエラーの原因はlメソッドの引数である、@user.created_at
のクラスが、ActiveSupport::TimeWithZone
であるからです。
I18nを用いる場合、lメソッドを用いた際には、よしなに日本語化してくれます。(application.rbなどを正しく設定できていれば)
しかしlメソッドの引数を翻訳するルールが、今回のエラーに大きく関係しているおり、
lメソッドを用いた場合、
Dateクラスのインスタンスは**ja.date.formats
配下のフォーマットを、
Timeクラスのインスタンスはja.time.formats
配下のフォーマット**を、
それぞれ自動的に探しに行く仕様になっています。(恐らく
なので今回のエラーは、l @user.created_at, format: :ja_ymd
の、
引数がActiveSupport::TimeWithZone
クラスなので、Railsがja.time.formats
配下を探しに行ったところ、
ja_ymd
フォーマットが定義されていなかったことが原因となります。
該当コード
ja:
date:
formats:
ja_ymd: ! '%Y年%m月%d日' # ここを自動的に呼び出してくれると期待していた。
ja_md: ! '%m月%d日'
ja_ym: ! '%Y年%m月'
hyphen: ! '%Y-%m-%d'
wday: '(%a)'
time:
formats:
ja_ymdhm: ! '%Y年%m月%d日 %H時%M分'
hm: ! '%H:%M'
ja_hm: ! '%H時%M分'
ymdhm: ! '%Y/%m/%d %H:%M'
mdhm: ! '%m/%d %H:%M'
dot_ymd: ! '%Y.%m.%d'
class Application < Rails::Application
I18n.enforce_available_locales = true
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]
config.i18n.available_locales = :ja
config.i18n.default_locale = :ja
end
<td>
<%= l @user.created_at, format: :ja_ymd %> # ここでエラー発生 なぜならja.time.formats配下にja_ymdが定義されていないから。
<%= l @user.created_at, format: :ja_hm %> # ここはエラーが発生しない なぜならja.time.formats配下にja_hmが定義されているから。
</td>
コンソールで確認
[2] pry(main)> @user.created_at.class
=> ActiveSupport::TimeWithZone
[3] pry(main)> I18n.l(Date.today, format: :ja_ymd)
=> "2021年09月22日"
[4] pry(main)> Date.today.class
=> Date
[5] pry(main)> I18n.l(Time.now, format: :ja_ymd) # エラー発生
I18n::MissingTranslationData: translation missing: ja.time.formats.ja_ymd
from /usr/local/bundle/gems/i18n-1.8.10/lib/i18n.rb:374:in `handle_exception`
[6] pry(main)> Time.now.class
=> Time # なぜならTimeクラスだから
解決策
ja:
date:
formats:
ja_ymd: ! '%Y年%m月%d日'
ja_md: ! '%m月%d日'
ja_ym: ! '%Y年%m月'
hyphen: ! '%Y-%m-%d'
wday: '(%a)'
time:
formats:
ja_ymdhm: ! '%Y年%m月%d日 %H時%M分'
ja_ymd: ! '%Y年%m月%d日' # time配下に追記
hm: ! '%H:%M'
ja_hm: ! '%H時%M分'
ymdhm: ! '%Y/%m/%d %H:%M'
mdhm: ! '%m/%d %H:%M'
dot_ymd: ! '%Y.%m.%d'
参考
最後までお読みいただき、ありがとうございました!