如何从URL获取Rails路由匹配模式?如何通过控制器#action获取路由?
获取Rails路由模板的两种方法
一、从请求路径获取对应的路由模板
如果你已经知道请求路径(比如/things/1),可以通过以下步骤拿到对应的路由模板(比如/things/:id):
- 先用
recognize_path识别路径对应的控制器、动作和参数:
path = "/things/1" recognized = Rails.application.routes.recognize_path(path) # 返回结果类似 { controller: "things", action: "show", id: "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
- 从匹配到的路由对象中提取模板:
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
相关产品推荐
相关产品推荐

