0
0

More than 1 year has passed since last update.

lメソッドを用いた際のエラー解決:translation missing[Rails, I18n]

Posted at

Railsの開発を進める中で、lメソッドを用いた際に、以下のようなエラーが発生したので、その原因と解決について記載したいと思います。
ちなみにI18nやlメソッドの詳しい利用方法に関しては、参考URLをご覧ください。

スクリーンショット 2021-09-22 22.33.30.png

結論 ≒ 原因

このエラーの原因は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フォーマットが定義されていなかったことが原因となります。

該当コード

config/locales/views/ja.yml(エラー発生時
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'
config/application.rb
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
app/views/users/show.html.erb
<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クラスだから

解決策

config/locales/views/ja.yml(修正
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'

参考

最後までお読みいただき、ありがとうございました!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0