- 更新日: 2016年7月5日
- Rails
Rails コントローラーで使う I18n.t メソッドのキーを省略
例えば、以下のような辞書ファイルを作成したとして。
config/locales/controllers/en.yml
1 2 3 4 5 |
en: users_controller: destroy: flash_success: "%{user_name} (id:%{user_id}): User destroyed." ... |
— 環境 —
rails-4.0.1
rspec-rails-2.14.0
capybara-2.2.0
Rails で i18n 辞書ファイル管理のディレクトリ構成と名前空間の方針まとめ | EasyRamble の方針で辞書ファイルを管理しています。
コントローラー内の t メソッドでキーを省略するとエラー
ビューのロケールファイルのようにキーを省略して、コントローラーの中で t メソッドを使うとエラーになります。
1 |
flash[:success] = t(".flash_success", { user_name: user.name, user_id: user.id }) |
ビュー用に作成した辞書ファイル、ja.users.destroy.flash_success を探しに行きますが、そんなものは定義していないので失敗します。コントローラー内のフラッシュメッセージ等の翻訳を、ビュー用の辞書ファイルに書いてしまうのも方法の一つかと思います。私は、コントローラー用とビュー用で辞書ファイルを分ける方針です。
また、config/locales/controllers/users_controller/en.yml と、ビュー同様に階層を揃えて配置して試しましたが同様のエラーになりました。名前空間を users_controller → users にすれば良いのだろうけど、ビューの辞書ファイルと名前空間が衝突するのでよろしくない。
キーのフルパス指定は面倒臭い
以下のようにキーをフルパスで指定すると、翻訳に成功します。
1 |
flash[:success] = t("users_controller.destroy.flash_success", { user_name: user.name, user_id: user.id }) |
しかし、面倒くさいし、コントローラーのコードが大変読みにくくなってしまいます。ということで以下の方法を採用することにしました。
キー省略のためコントローラー用に t メソッドをオーバーライド
application_controller.rb に以下のメソッドを定義しました。
app/controllers/application_controller.rb
1 2 3 4 5 6 |
def t(key, options={}) if key[0] == '.' key = controller_name + "_controller." + action_name + key end super end |
コントローラー内からは以下のように、オーバーライドした t メソッドを呼び出す。
1 |
flash[:success] = t(".flash_success", { user_name: user.name, user_id: user.id }) |
翻訳が成功します。
冒頭に書いた辞書ファイル(yaml)の書式に従い、定義した t メソッドを使うと、コントローラー内でのフラッシュメッセージ等の翻訳が簡略化されます。
【追記 2014/02/27】
当初、t_c メソッドという名前で、オーバーライドせずに別名のメソッドを作成していましたが、t メソッドをオーバーライドする方法に変更しました。これでビューで呼ぶのと同じ形式で、t メソッドを使えます。
Rails4 の Controller は、デフォルトで I18n を読み込んでおり、t メソッドを直接使えるようです。t メソッドをオーバーライドする前に、以下のように確認しました。
1 2 3 4 5 6 7 8 9 10 |
pry(main)> ApplicationController.instance_methods => [:store_location, ... :translate, :t, :localize, :l, ... |
ApplicationController はデフォルトで、translate (t) メソッド、localize (l) メソッドを、インスタンスメソッドとして持っています。
- Rails の関連記事
- RailsでMySQLパーティショニングのマイグレーション
- Rails ActiveRecordでdatetime型カラムのGROUP BY集計にタイムゾーンを考慮する
- RailsプラグインGemの作成方法、RSpecテストまで含めたrails pluginの作り方
- RailsでAMPに対応するgemをリリースしました
- Railsでrequest.urlとrequest.original_urlの違い
- Railsでwheneverによるcronバッチ処理
- Google AnalyticsのRails Turbolinks対応
- Railsアプリにソーシャル・シェアボタンを簡単設置
- Rails監視ツール用にErrbitをHerokuで運用
- Facebook APIバージョンのアップグレード手順(Rails OmniAuth)
- 初回公開日: 2014年2月25日
Leave Your Message!