controller_and_action ヘルパー : 小林研 Rails Tips (32)

はじめに

Rails Tips の 32 回目です。明けましておめでとうございます。年を越しましたが、まだネタが終わらないので連載を続けます。今日のネタは path と method からコントローラとアクションの名前を取得する controller_and_action ヘルパーを紹介します。このメソッド自体は直接使うよりも、他のメソッドから呼ばれることの方が多いものになります。

controller_and_action

path と method からコントローラとアクションを取得することができると、その情報からさまざまな処理が可能になります。path のみが与えられた時には get method であることとします。同じ path でも method が異なると別のアクションになるので注意が必要です。

当初はこの controller_and_action だけを用意していましたが、その後 id などの付加情報が必要となるメソッドが発生したので、この関数の下請け関数である controller_action_and_params も用意しています。これらのテストは以下のように記載しています。後者は hash で返し、前者はコントローラとアクションの配列で返します。

describe ApplicationHelper, type: :helper do
  subject { helper }

  describe "common test" do
    it_behaves_like "単一メソッド呼び出し" do
      let(:test_set) do
        {
          controller_action_and_params: [
            teacher_clubs_path, {controller: "teacher/clubs", action: "index"},
            [teacher_clubs_path, :post], {controller: "teacher/clubs", action: "create"},
            teacher_gakusei_path(1), {controller: "teacher/gakuseis", action: "show", id: "1"},
            teacher_gnumber_tannis_path(1), {controller: "teacher/gnumbers/tannis", action: "index", gnumber_id: "1"},
          ],
          controller_and_action: [
            teacher_clubs_path, %w[teacher/clubs index],
            [teacher_clubs_path, :post], %w[teacher/clubs create],
            teacher_gakusei_path(1), %w[teacher/gakuseis show],
            teacher_gnumber_tannis_path(1), %w[teacher/gnumbers/tannis index],
          ],
        }
      end
    end
  end
end

controller_action_and_params の実装

controller_action_and_params は routes の recognize_path を呼んでいるだけです。これによって controller と action を含むハッシュが取得できます。

  # @param [String] path path 名
  # @param [Symbol, nil] method メソッド名
  # @return [Hash] コントローラ名とアクション名およびパラメータのハッシュ
  def controller_action_and_params(path, method = :get)
    Rails.application.routes.recognize_path(path, method: method)
  end

controller_and_action の実装

controller_and_action は controller_action_and_params で返ってきたハッシュの中の controlleraction キーの中身を返すだけです。

  # @param [String] path path 名
  # @param [Symbol,nil] method メソッド名
  # @return [Array<String>] コントローラ名とアクション名の配列
  def controller_and_action(path, method = :get)
    controller_action_and_params(path, method).values_at(:controller, :action)
  end

おわりに

今回は、path と method から controller と action などを取得するメソッドを二つ紹介しました。明日からはこれらを使ったヘルパーを紹介していきます。