如何获取Sinatra应用程序中使用的所有路由的列表?

时间:2012-12-04 00:12:29

标签: routes sinatra

说我有:

require 'sinatra'

get '/' { "hi" }
get '/a' { "a" }
get '/b' { "b" }

在我的Sinatra应用程序中是否有任何简单方法可以获取所有已定义路径的列表?

我调查了Sinatra::Base.routes,但这似乎不包含我刚定义的路线。

我希望有一个很好的方法来制作像routes.each { |r| p r }这样的自我记录API来获取:

/
/a
/b

2 个答案:

答案 0 :(得分:26)

您应该调查Sinatra::Application.routes,其中包含您的路线。这将打印路线模式的正则表达式:

require 'sinatra'

get '/'  do "root" end
get '/a' do "a" end
get '/b' do "b" end

Sinatra::Application.routes["GET"].each do |route|
  puts route[0]
end

为简化起见,请查看sinatra-advanced-routes扩展名。它为您提供了一个很好的API来反省路线:

require 'sinatra'
require 'sinatra/advanced_routes'

get '/'  do "root" end
get '/a' do "a" end
get '/b' do "b" end

Sinatra::Application.each_route do |route|
  puts route.verb + " " + route.path
end

有关更多文档和示例,请参阅sinatra-advanced-routes的README

答案 1 :(得分:2)

这是一个输出路线列表的rake任务:

desc 'List defined routes'
task :routes do
  require 'app/web/web'

  Shoebox::Server.routes.map do |method, routes|
    routes.map { |r| r.first.to_s }.map do |route|
      "#{method.rjust(7, ' ')} #{route}"
    end
  end.flatten.sort.each do |route|
    puts route
  end
end

输出:

    GET /asset/:id
   HEAD /asset/:id
   POST /asset/:aggregate_id/provide
OPTIONS /asset