给定一个我知道路径的机架请求,例如
/things/1
,我怎样才能获得路线参考,例如/things/:id
?
我可以使用
Rails.application.routes.recognize_path
来获取控制器和操作,但我明确地寻找模糊路径。
有没有办法在给定控制器#action的情况下获取可识别的路线?
我知道可以获取该信息的唯一地方是
bin/rails routes
。它使用检查器来收集所有信息:
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)"]
route
这里是 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.
跟进 Alex 的回答:在 Rails 7.1 上,我遇到了错误:
nil 的未定义方法“路径”:NilClass
什么对我有用:
Rails.application.routes.router.recognize(
ActionDispatch::Request.new(Rack::MockRequest.env_for("/users/1/edit", method: :get))
) {}.map { |route| route.path.spec.to_s }