はじめに
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 などではこれまで直接日本語で属性名などを書いていました。このメソッドにより名前の揺れがなくなり、日本語を直接ビューなどに書かなくてよくなりました。以前書いたものも、このメソッドに書き換えるようにしています。