カテゴリー:
Rails
タグ:
 Rails locale collection_select

このエントリーをはてなブックマークに追加
更新日時:
2013年02月12日(火)
作成日時:
2013年02月12日(火)

前の記事 / 次の記事

他にもっとダイレクトな方法が用意されていそうな気もするのだけど、とりあえずメモ。

例えば次のような時、

-# haml
=form_for @cars do |f|
  =f.label :maker
  =f.collection_select :maker_id, Maker.all, :id, :name

ユーザーに表示されるのはロケールが日本語であっても英語であっても、
Makerインスタンスのnameで取得される値である。

Makerインスタンスのnameが"honda"だったらロケールに関わりなく「honda」が表示される。
これをロケールが日本語だったら「ホンダ」、英語だったら「HONDA」と表示されるようにしたい。

collection_selectの第4引数はDBのカラム名ということではなく、
Makerインスタンスのメソッド名なので、モデル側で翻訳済みであれば翻訳された値になるはず。

まず、出力時にモデル側で翻訳するようにする。

class Maker < ActiveRecord::Base
  # モデル内で翻訳ヘルパーを使えるようにする
  include ActionView::Helpers::TranslationHelper

  attr_accessible :name
  has_many :cars

  def i18n_name
    t"activerecord.attribtes.#{self.class_to_s.underscore}.i18n_names.#{name}"
  end
end

次に、ロケールを定義する。

ja:
  activerecord:
    attributes:
      maker:
      name: メーカー名
      i18n_names:
        honda:  ホンダ
        nissan: 日産
        toyota: トヨタ

en:
  activerecord:
    attributes:
      maker:
      name: maker's name
      i18n_names:
        honda:  HONDA
        nissan: NISSAN
        toyota: TOYOTA

そしてビューで i18n_name を出力するようにする。

-# haml
=form_for @cars do |f|
  =f.label :maker
  -#=f.collection_select :maker_id, Maker.all, :id, :name
  =f.collection_select :maker_id, Maker.all, :id, :i18n_name