はじめに
Rails Tips の 34 回目です。昨日は locales に書かれたタイトルを html 自体とのタイトルとページタイトルに自動で描画する仕組みを紹介しました。せっかくタイトルが locales に記載されているのであれば、他でも有効利用したいところです。そこで、path と method からタイトルを取得するヘルパーメソッドを紹介します。
title_from_cap
title_from_path
を作成する前にコントローラやアクション名などを含むハッシュからタイトルを取得するヘルパーメソッドである title_from_cap
を作成します。いつものように、まず application_helper_spec の該当部分で動作を説明します。別のテストでも利用しているので、ハッシュは let で用意しています。controller, action の値がハッシュから取得できるので、これを活用すればいいことになります。
describe "common test" do it_behaves_like "単一メソッド呼び出し" do let(:test_set) do cap_nsr = {controller: "nyusen/suisens", action: "reception_list"} cap_tgi = {controller: "teacher/gakus", action: "index"} { title_from_cap: [ [cap_nsr], "受付簿(推薦選抜)", [cap_tgi], "学生室トップページ", ], } end end end
はじめにで記述したようにタイトルは locales に記載されていますので、それを取り出すことになります。タイトル以外の属性も今後取り出すことになるので、さらに汎用的なメソッドある key_from_cap
というヘルパーも作っておきます。テストも以下のように追加しておきましょう。ここではタイトル(:title
)と詳細(:detail
)のキーをそれぞれの locales から取得するようにしています。
key_from_cap: [ [cap_nsr, :title], "受付簿(推薦選抜)", [cap_tgi, :detail], "学生室のトップページを表示します。", ],
locales からは t メソッドで値を取得できます。この時、scope でコントローラとアクションの配列を渡すことで、階層的に locales を辿っていき、最後に key で欲しい翻訳を取得します。ただし、テストにあるような namespace
を使っていたり、階層的なルーティングの場合には controller
の部分に /
が含まれます。locales ではそれらは .
で表現されるので、その置き換えを tr
で行っています。
# @param [Hash] cap コントローラ名・アクション名・パラメータのハッシュ # @param [Symbol] key def key_from_cap(cap, key) t key, scope: cap.values_at(:controller, :action).map { |x| x.tr "/", "." } end
title_from_cap
はこの key_from_cap
を呼び出すだけです。
# @param [Hash] cap コントローラ名・アクション名・パラメータのハッシュ # @return [String] タイトル def title_from_cap(cap) key_from_cap cap, :title end
title_from_path
本日のお題である title_from_path は path と method からタイトルを取得するものになります。パスからタイトルが取得されることを以下のテストで確認しています。ほとんど index で使われるので method を渡すテストをしていませんが、本来なら post や edit などのテストもしておくべきですね。サボっていました。
title_from_path: [ reception_list_nyusen_suisens_path, "受付簿(推薦選抜)", teacher_gakus_path, "学生室トップページ", ],
実際、上で紹介した tile_from_cap
直接呼ばれることはほとんどなく、実際には本日のお題である title_from_path
から呼び出されます。すでにお分かりと思いますが、元日に紹介した controll_action_and_params
がここで登場するわけです(controller_and_action ヘルパー : 小林研 Rails Tips (32) - hkob’s blog)。method は省略されることが多くほとんどの場合が get になります。
# @param [String] path path 名 # @param [Symbol,nil] method メソッド名 # @return [String] タイトル def title_from_path(path, method = :get) title_from_cap controller_action_and_params(path, method) end
おわりに
title_from_path はパス名からタイトルを取得することができるので、リンクタイトルの自動描画などに活用できます。ただし、実際には明日解説するもう一つのメソッドから呼び出されることの方が多いです。