This page looks best with JavaScript enabled
⚠️

【Rails】URLからコントローラやアクション、paramsを取得する

 ·  ☕ 1 分で読めます
✏️

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 ソースコード

Share on

END
END
@aiandrox

 
目次