t_ars ヘルパー : 小林研 Rails Tips (30)

はじめに

Rails Tips の 30 回目です。model_spec と request_spec で使っている shared example がほぼ解説終わりました。今日からは私がよく利用しているヘルパーメソッドをいくつか紹介していきたいと思います。

t_ars

t_ars はモデル名やモデルの属性名を取得するためのメソッドです。引数により返却されるものが異なります。

  • モデルクラスのみ(t_ars Year): モデル名「年度」
  • クラスと属性一つ(t_ars Year, :year): 属性名「西暦」
  • クラスと属性の配列(t_ars Year, %i[year default_year]): 属性名の配列「西暦とデフォルト年度」

テストを簡単に実行するために、12日目に紹介した単一メソッド呼び出しを利用しています。

describe ApplicationHelper, type: :helper do
  subject { helper }

  describe "common test" do
    it_behaves_like "単一メソッド呼び出し" do
      let(:test_set) do
          t_ars: [
            [Year], "年度",
            [Year, :year], "西暦",
            [Year, :default_year], "デフォルト年度",
            [Year, %i[year default_year]], %w[西暦 デフォルト年度],
          ],
      end
    end
  end
end

準備

それぞれの名前は config/locales/models/ja.yml に保存してあります。該当する部分のみを抜粋すると以下のようになります。 ja.activerecord.models の下にはモデル名、 ja.activerecord.attributes の下に属性名を記述してあります。

ja:
  activerecord:
    ### model 名
    models:
      year: 年度

    attributes:
      year:
        year: 西暦
        default_year: デフォルト年度
        wareki: 和暦

実装

モデル名はモデルクラスに対して、 model_name.human として取得できます。一方、属性名は human_attribute_name で key のものが取得できます。attrs が配列かどうかを判定し、配列でなければ単一の値を返すようにしています。

  # @param [Class] model モデルクラス
  # @param [Array<Symbols>] attr アトリビュートkey
  # @return [String, Array<String>] attrs が空の場合はモデル名,そうでない場合は attrs のアトリビュート名の配列または一つの値
  def t_ars(model, attrs = nil)
    if attrs.nil?
      model.model_name.human
    elsif attrs.is_a? Array
      attrs.map { |k| model.human_attribute_name k }
    else
      model.human_attribute_name attrs
    end
  end

おわりに

form などにおけるラベルでは自動的に翻訳文字列が取得できます。ただし、show などではこれまで直接日本語で属性名などを書いていました。このメソッドにより名前の揺れがなくなり、日本語を直接ビューなどに書かなくてよくなりました。以前書いたものも、このメソッドに書き換えるようにしています。