はじめに
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 から取得できるので、ほとんどのメニューからのリンクはこれらを使って記述できるようになりました。