You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从URL获取Rails路由匹配模式?如何通过控制器#action获取路由?

获取Rails路由模板的两种方法

一、从请求路径获取对应的路由模板

如果你已经知道请求路径(比如/things/1),可以通过以下步骤拿到对应的路由模板(比如/things/:id):

  1. 先用recognize_path识别路径对应的控制器、动作和参数:
path = "/things/1"
recognized = Rails.application.routes.recognize_path(path)
# 返回结果类似 { controller: "things", action: "show", id: "1" }
  1. 遍历Rails路由集合,找到匹配该控制器、动作且能匹配原路径的路由对象:
matching_route = Rails.application.routes.routes.find do |route|
  route.defaults[:controller] == recognized[:controller] &&
  route.defaults[:action] == recognized[:action] &&
  route.path.match(path)
end
  1. 从匹配到的路由对象中提取模板:
route_template = matching_route.path.spec.to_s if matching_route
# 此时route_template的值就是 "/things/:id"

注意:如果同一个控制器+动作对应多个路由(比如带不同参数约束的路由),find会返回第一个匹配项,你可能需要根据参数约束进一步筛选。

二、通过控制器#action获取对应的路由模板

如果已知控制器和动作(比如ThingsController#show),可以直接遍历路由集合筛选:

controller_name = "things" # 注意是字符串形式,不带"Controller"后缀
action_name = "show"

# 筛选所有匹配该控制器和动作的路由
matching_routes = Rails.application.routes.routes.select do |route|
  route.defaults[:controller] == controller_name &&
  route.defaults[:action] == action_name
end

# 提取每个匹配路由的模板
route_templates = matching_routes.map { |route| route.path.spec.to_s }

如果你的路由是命名路由,也可以通过命名路由直接获取模板:

# 假设路由命名为 :thing
named_route = Rails.application.routes.named_routes[:thing]
route_template = named_route.path.spec.to_s

内容的提问来源于stack exchange,提问作者Dudo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 06:13:21