说我有:
require 'sinatra'
get '/' { "hi" }
get '/a' { "a" }
get '/b' { "b" }
有什么简单的方法可以在我的 Sinatra 应用程序中获取所有已定义路由的列表?
我调查Sinatra::Base.routes
了,但这似乎不包含我刚刚定义的路线。
我希望有一个很好的方法来制作一个自我记录的 API,比如routes.each { |r| p r }
:
/
/a
/b
您应该调查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。
这是一个输出路由列表的 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