はじめに
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 で返ってきたハッシュの中の controller
と action
キーの中身を返すだけです。
# @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 などを取得するメソッドを二つ紹介しました。明日からはこれらを使ったヘルパーを紹介していきます。