title_from_path ヘルパー : 小林研 Rails Tips (34)

はじめに

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 はパス名からタイトルを取得することができるので、リンクタイトルの自動描画などに活用できます。ただし、実際には明日解説するもう一つのメソッドから呼び出されることの方が多いです。