Rails コントローラーで使う I18n.t メソッドのキーを省略

スポンサーリンク

例えば、以下のような辞書ファイルを作成したとして。

config/locales/controllers/en.yml

【お知らせ】 英単語を画像イメージで楽に暗記できる辞書サイトを作りました。英語学習中の方は、ぜひご利用ください!
画像付き英語辞書 Imagict | 英単語をイメージで暗記
【開発記録】
英単語を画像イメージで暗記できる英語辞書サービスを作って公開しました
スポンサーリンク

— 環境 —
rails-4.0.1
rspec-rails-2.14.0
capybara-2.2.0

Rails で i18n 辞書ファイル管理のディレクトリ構成と名前空間の方針まとめ | EasyRamble の方針で辞書ファイルを管理しています。

コントローラー内の t メソッドでキーを省略するとエラー

ビューのロケールファイルのようにキーを省略して、コントローラーの中で t メソッドを使うとエラーになります。

translation missing: ja.users.destroy.flash_success

ビュー用に作成した辞書ファイル、ja.users.destroy.flash_success を探しに行きますが、そんなものは定義していないので失敗します。コントローラー内のフラッシュメッセージ等の翻訳を、ビュー用の辞書ファイルに書いてしまうのも方法の一つかと思います。私は、コントローラー用とビュー用で辞書ファイルを分ける方針です。

また、config/locales/controllers/users_controller/en.yml と、ビュー同様に階層を揃えて配置して試しましたが同様のエラーになりました。名前空間を users_controller → users にすれば良いのだろうけど、ビューの辞書ファイルと名前空間が衝突するのでよろしくない。

キーのフルパス指定は面倒臭い

以下のようにキーをフルパスで指定すると、翻訳に成功します。

Mrs. Kristofer Douglas(id:20): User destroyed.

しかし、面倒くさいし、コントローラーのコードが大変読みにくくなってしまいます。ということで以下の方法を採用することにしました。

キー省略のためコントローラー用に t メソッドをオーバーライド

application_controller.rb に以下のメソッドを定義しました。

app/controllers/application_controller.rb

コントローラー内からは以下のように、オーバーライドした t メソッドを呼び出す。

翻訳が成功します。

Keon Gorczany (id:32): User destroyed.

冒頭に書いた辞書ファイル(yaml)の書式に従い、定義した t メソッドを使うと、コントローラー内でのフラッシュメッセージ等の翻訳が簡略化されます。

【追記 2014/02/27】
当初、t_c メソッドという名前で、オーバーライドせずに別名のメソッドを作成していましたが、t メソッドをオーバーライドする方法に変更しました。これでビューで呼ぶのと同じ形式で、t メソッドを使えます。

Rails4 の Controller は、デフォルトで I18n を読み込んでおり、t メソッドを直接使えるようです。t メソッドをオーバーライドする前に、以下のように確認しました。

ApplicationController はデフォルトで、translate (t) メソッド、localize (l) メソッドを、インスタンスメソッドとして持っています。

スポンサーリンク
パーフェクト Ruby on Rails は、最近読んだ Rails 本の中では一番役に立った本です。Chef や Capistrano など Rails と共によく使用される技術にも触れてあります。Ruby on Rails 4 アプリケーションプログラミングは、入門的な内容で Rails の機能全体を網羅されています。
 
スポンサーリンク

Leave Your Message!