我在 Ruby on Rails 中编写了一个 API,我希望有一个页面列出所有可用的路由(我知道这可以通过命令行使用 来完成rake routes
)。
我想自动生成它,而不是在更新代码时自己更新它。有没有办法获取控制器(或视图)中所有路由的列表?
我在 Ruby on Rails 中编写了一个 API,我希望有一个页面列出所有可用的路由(我知道这可以通过命令行使用 来完成rake routes
)。
我想自动生成它,而不是在更新代码时自己更新它。有没有办法获取控制器(或视图)中所有路由的列表?
我开始探索 jvnill 给出的解决方案,并在文档中发现它指出不应使用RouteInspector 。出于什么原因我不知道,但我决定看一下代码,并尝试获得更有用的输出,而不仅仅是字符串。我使用 jvnill 的代码作为起点。
all_routes = Rails.application.routes.routes
routes = all_routes.routes.collect do | route |
reqs = route.requirements
controller = reqs[:controller] || ':controller'
action = reqs[:action] || ':action'
constraints = reqs.except(:controller, :action)
verb = route.verb.source.gsub(/[$^]/, '')
{name: route.name.to_s, verb: verb, path: route.path.spec.to_s, reqs: reqs}
end
routes.reject! { |r| r[:path].starts_with?("/rails/info/properties") || r[:path] == "#{Rails.application.config.assets.prefix}" }
routes
然后包含一个哈希,其中包含路由名称、路径以及控制器和操作。
你可以看看 rake 路由的 rake 任务是如何实现的 :) 它位于 railties gem 里面lib/rails/tasks/routes.rake
。但为了更容易,这里是
task :routes => :environment do
Rails.application.reload_routes!
all_routes = Rails.application.routes.routes
require 'rails/application/route_inspector'
inspector = Rails::Application::RouteInspector.new
puts inspector.format(all_routes, ENV['CONTROLLER']).join "\n"
end