【问题标题】:How do I get the route for a path, in a rails application?如何在 Rails 应用程序中获取路径的路径?
【发布时间】:2014-06-27 16:51:22
【问题描述】:

给定一个方法和路径,我想询问 Rails 如何路由该请求,并且我希望能够从控制台和/或从 rake 任务执行此操作。我认为这应该很简单——ActionDispatch 对每个请求都这样做,路由测试方法显然也这样做。

(目前:Rails 3.0.x,但对于我正在编写的 gem,我需要能够在 Rails 3.0 到 4.1 中执行此操作,至少,并且可能在旧版本中也是如此。)

我一直在尝试这样的一些事情:

routes = ActionDispatch::Routing::RouteSet.new
routes.recognize_path('/my/path/23/edit')

Rails.application.routes.recognize_path('/my/path/23/edit')

在这两种情况下,我都会返回“RuntimeError: route set not finalized”。

我正在慢慢研究 ActionDispatch 代码,但如果有人知道他们头脑中的答案,那将为我节省大量时间。所以谢谢!

【问题讨论】:

  • 使用Rails.application.routes.recognize_path 在我的系统上工作正常,所以命令是正确的。也许某些东西没有正确设置?你想在哪里打这个电话?
  • 在进一步调查中,有一个finalize! 方法(duh),但是在如上所述初始化时我得到了一个空路由集。所以我似乎遗漏了一些关于 RouteSet 的初始化。
  • @Micah:我正在尝试在控制台中运行它,目前只是为了测试它。一旦我让它工作起来,它就会进入一个 gem,分析请求/响应对的记录,以确定在这些请求期间实际命中了哪些唯一路由。
  • 显然我得到了一个空路由集:1.8.7-head :037 > Rails.application.routes.routes => []

标签: ruby-on-rails ruby ruby-on-rails-3 rails-routing actiondispatch


【解决方案1】:

规范的答案实际上是我的问题中给出的:

# GET request
Rails.application.routes.recognize_path('/some/path/63') 

# POST request
Rails.application.routes.recognize_path('/some/path', {:method => :post })

这似乎不起作用,因为我之前尝试过手动初始化 RouteSet,这干扰了环境正确加载路由的能力。当我重新启动控制台会话时,上述命令运行良好。

【讨论】:

  • 啊哈,有些东西设置不正确。或者更准确地说,设置被覆盖了。很高兴你明白了。
猜你喜欢
  • 2020-05-25
  • 1970-01-01
  • 2011-05-16
  • 2014-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-07
相关资源
最近更新 更多