URLからRailsのルートパターンを見つける方法

概要

パスがわかっているラックリクエストがあるとします。 /things/1、ルート参照を取得するにはどうすればよいですか。 /もの/:ID?

Rails.application.routes.recognize_path を使用してコントローラーとアクションを取得できますが、難読化されたパスを明示的に探しています。

とにかく、controller#actionを指定して認識されたルートを取得することはできますか?

解決策

レール v7.1

彼らはそれを少し簡単にしました:

request.route_uri_pattern
#=> "/users/:id/edit(.:format)"

https://translate.google.com/translate?hl=ja&sl=en&tl=ja&u=https://api.rubyonrails.org/v7.1.3.2/classes/ActionDispatch/Request.html#method-i-route_uri_pattern

レール v7.0

その情報が入手できる場所を私が知っていた唯一の場所は、bin/rails ルートです。すべての情報を収集するためにインスペクターを使用しています。

https://translate.google.com/translate?hl=ja&sl=en&tl=ja&u=https://github.com/rails/rails/blob/v7.0.4.3/actionpack/lib/action_dispatch/routing/inspector.rb

もしかしたら、他にも何か見つかるかもしれません。しかし、私はあなたが求めている主な部分を抽出しました:

# in a controller or a template

<% request.routes.router.recognize(request) do |route, _params| %>
  <%= route.path.spec.to_s %> # => /users/:id(.:format)
<% end %>
# in a console

>> Rails.application.routes.router.recognize(
  ActionDispatch::Request.new(Rack::MockRequest.env_for("/users/1/edit", method: :get))
) {}.map {|_,_,route| route.path.spec.to_s }
=> ["/users/:id/edit(.:format)"]

ここでのルートは、ルートに関するすべての情報を含む ActionDispatch::Journey::Route インスタンスです。

これが何をするのか全く分かりませんが、それは可能です:

>> Rails.application.routes.routes.simulator.memos("/users/1/edit").first.ast.to_s
=> "/users/:id/edit(.:format)"

# NOTE: if route doesn't match it will `yield` and raise
# no block given (yield) (LocalJumpError)
# just rescue or give it an empty block.

https://translate.google.com/translate?hl=ja&sl=en&tl=ja&u=https://github.com/rails/rails/blob/v7.0.4.3/actionpack/lib/action_dispatch/journey/gtg/simulator.rb#L25