2012年9月30日日曜日

RailsのI18nをちょっと便利にする方法

RailsのI18nを使っていて不満だったのが、
新規登録画面や、編集画面のような、フォームの中であれば、
<%= f.label :family_name %>
のように、フォームのラベルメソッドを利用するだけで、
自動でI18nのロケールファイルを利用してくれるのに、
参照画面や一覧画面のような、フォーム外の場所だと、
いちいち、
<%= t activerecord.attributes.person.family_name %>
のように、長いキーを指定しないといけないところでした。
これをちょっと改善する、コードを書いてみました。

ActiveRecodeの拡張

以下の内容のrubyファイルを、config/initializersに配置する。
class ActiveRecord::Base  
  # class methods
  class << self
    # ロケールファイルに定義された、モデルや属性の表示名を取得する。
    # 引数は属性名の文字列かシンボル。引数を省略するとモデル名を取得できます。
    def label(field=nil)
      key = "activerecord."
      if field
        key << "attributes." << self.name.underscore << "." << field.to_s
      else
        key << "models." << self.name.underscore
      end
      return I18n.t key
    end   
  end  
end

使い方

Personというモデルに、family_nameという属性がある場合の例。labelメソッドの引数は属性名を表す文字列かシンボル。引数を省略すると、モデル名が取得できます。
<%= Person.label :family_name %>

わざわざ、ActiveRecord::Baseのメソッドにしなくても、 普通にApplicationHelperに、t_modelメソッドみたいなものを作れば良かっただけの話だな、 と後から気づいたものの、せっかく書いたのでアップします。。