link_title_from_path ヘルパー : 小林研 Rails Tips (35)

はじめに

Rails Tips の 35 回目です。昨日は、path と method からタイトルを取得するヘルパーメソッドを紹介しました。今日はリンク用のタイトルを取得するメソッドである link_title_from_path を紹介します。

link_title_from_cap

link_title_from_path は昨日の title_from_path と仕組みは同じです。key を title ではなく link_title にしているだけです。ただし、全てのページに link_title を設定するのは大変なので、link_title の locales 指定がない場合には、title を流用する形にします。reception_list の方は link_title が指定されているので、link_title が変わっていますが、gakus の方は同じものが入っています。

  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], "学生室トップページ",
          ],
      link_title_from_cap: [
            [cap_nsr], "推薦選抜受付簿作成",
            [cap_tgi], "学生室トップページ",
          ],
        }
      end
    end
  end

昨日は views/ja.yml の紹介をしませんでした。こんな感じで設定されています。該当部分のみ抜粋して紹介します。このように reception_list の方にだけ link_title が設定されています。

ja:
  nyusen:
    suisens:
      reception_list:
        title: 受付簿(推薦選抜)
        link_title: 推薦選抜受付簿作成
  teacher:
    gakus:
      index:
        title: 学生室トップページ

中身は昨日の key_from_cap で link_title を取得しているだけです。link_title が設定されていない場合、translation_missing になるので、その場合に title を取得します。

  # @param [Hash] cap コントローラ名・アクション名・パラメータのハッシュ
  # @return [String] リンクタイトル
  def link_title_from_cap(cap)
    ans = key_from_cap cap, :link_title
    ans = title_from_cap(cap) if ans =~ /translation_missing/
    ans
  end

link_title_from_path

本日のお題である link_title_from_path は path と method からタイトルを取得するものになります。昨日と同じく、path と method からリンクタイトルを取得するものになります。これとは別にタイトルと同時に path 自体も一緒に返す link_title_with_path というヘルパーも一緒に作成します。こうすることで、そのまま link_to に渡せるためです。

          link_title_from_path: [
            reception_list_nyusen_suisens_path, "推薦選抜受付簿作成",
            teacher_gakus_path, "学生室トップページ",
          ],
          link_title_with_path: [
            reception_list_nyusen_suisens_path, ["推薦選抜受付簿作成", reception_list_nyusen_suisens_path],
            teacher_gakus_path, ["学生室トップページ", teacher_gakus_path],
          ],

実装は簡単ですね。title_from_path と同様 controller_action_and_params の返り値を link_title_from_cap に渡すだけです。link_title_with_path は取得したタイトルとパスを配列で返します。そのまま link_to に展開して渡してあげればそのままリンクになります。

  # @param [String] path path 名
  # @param [Symbol,nil] method メソッド名
  # @return [String] タイトル
  def link_title_from_path(path, method = :get)
    link_title_from_cap(controller_action_and_params(path, method))
  end

  # @param [String] path path 名
  # @param [Symbol,nil] method メソッド名
  # @return [Array<String>] タイトルとパスの配列
  def link_title_with_path(path, method = :get)
    [link_title_from_path(path, method), path]
  end

おわりに

昨日説明したように link_title または title が locales から取得できるので、ほとんどのメニューからのリンクはこれらを使って記述できるようになりました。