ruby-on-rails 如何从url中找到rails路由模式

vngu2lb8  于 2023-03-31  发布在  Ruby
关注(0)|答案(1)|浏览(139)

如果我知道一个机架请求的路径,例如/things/1,我如何获得路由参考,例如/things/:id
我可以使用Rails.application.routes.recognize_path来获取控制器和操作,但我显式地寻找混淆的路径。
有没有办法得到认可的路由给定一个控制器#行动,也许?

bzzcjhmw

bzzcjhmw1#

我所知道的唯一一个可以获得这些信息的地方是bin/rails routes。它使用inspector来收集所有信息:

  • 一个月一次 *

也许你还能在那里找到别的东西。但我提取了你所要求的主要部分:

# 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.
  • 网址:http:github.com/rails/rails/blob/v7.0.4.3/actionpack/lib/action_dispatch/journey/gtg/simulator.rb#L25*

相关问题