如何从url查找铁路路线模式

问题描述 投票:0回答:2

给定一个我知道路径的机架请求,例如

/things/1
,我怎样才能获得路线参考,例如
/things/:id

我可以使用

Rails.application.routes.recognize_path
来获取控制器和操作,但我明确地寻找模糊路径。

有没有办法在给定控制器#action的情况下获取可识别的路线?

ruby-on-rails ruby routes rack
2个回答
4
投票

我知道可以获取该信息的唯一地方是

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.

https://github.com/rails/rails/blob/v7.0.4.3/actionpack/lib/action_dispatch/journey/gtg/simulator.rb#L25


1
投票

跟进 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 }
© www.soinside.com 2019 - 2024. All rights reserved.