URLの文字列からコントローラ・アクションを取得する
Rails.application.routes.recognize_path
にURLの文字列を渡すと、いい感じのハッシュを返してくれます。
1
2
3
4
5
6
|
[1] pry(main)> Rails.application.routes.recognize_path('/mypage')
=> {:controller=>"mypage", :action=>"index"}
[2] pry(main)> Rails.application.routes.recognize_path('https://example.com/mypage')
=> {:controller=>"mypage", :action=>"index"}
[3] pry(main)> Rails.application.routes.recognize_path('users/1')
=> {:controller=>"users", :action=>"show", :id=> "1"}
|
get以外の場合
method
を指定すると、該当のアクションを返します。デフォルト値はgetです。
値は:post
でも、"post"
でも"POST"
でも問題ないです。
1
2
3
4
|
[13] pry(main)> Rails.application.routes.recognize_path('users/1')
=> {:controller=>"users", :action=>"show", :id=>"1"}
[14] pry(main)> Rails.application.routes.recognize_path('users/1', method: :put)
=> {:controller=>"users", :action=>"update", :id=>"1"}
|
サブドメインの場合
1
2
3
4
5
|
[3] pry(main)> Rails.application.routes.recognize_path('users/1/edit')
ActionController::RoutingError: No route matches "https://example.com/users/1/edit"
from /Users/k-end/development/hogehoge/vendor/bundle/ruby/2.7.0/gems/actionpack-6.1.7/lib/action_dispatch/routing/route_set.rb:886:in 'recognize_path_with_request'
[4] pry(main)> Rails.application.routes.recognize_path('https://admin.example.com/users/1/edit')
=> {:subdomain=>"admin", :controller=>"admin/users", :action=>"edit", :id=>"1"}
|
カスタムパラメータを追加したい場合
1
2
3
4
|
[1] pry(main)> Rails.application.routes.recognize_path('users/1/', extras: { hoge: 'hoge' })
=> {:controller=>"users", :action=>"show", :id=>"1", :hoge=>"hoge"}
[2] pry(main)> Rails.application.routes.recognize_path('users/1/', extras: { 'hoge': 'hoge' })
=> {:controller=>"users", :action=>"show", :id=>"1", :hoge=>"hoge"}
|
参考
URL(path)の文字列から Routing パラメーターの Hash に変換する - Qiita
Rails console で Rails routes を詳しく確認する方法 - Qiita
GitHub ソースコード