2012-12-04 9 views
14

Dire che ho:Come ottenere un elenco di tutte le rotte utilizzate in un'app Sinatra?

require 'sinatra' 

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

non v'è alcun modo semplice per ottenere un elenco di tutti i percorsi definiti nella mia applicazione Sinatra?

Ho studiato Sinatra::Base.routes, ma questo non sembra contenere i percorsi che ho appena definito.

speravo di avere un bel modo per fare un API di auto che documentano come routes.each { |r| p r } arrivare:

/ 
/a 
/b 

risposta

27

Si dovrebbe indagare Sinatra::Application.routes, che contiene i percorsi. Questo stampa le espressioni regolari dei modelli di percorso:

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 

Per rendere le cose più semplici, prendono cerca nella estensione sinatra-advanced-routes. Ti dà una bella API per l'introspezione dei percorsi:

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 

Vedi l'README di Sinatra-Advanced-percorsi per più documentazione ed esempi.

+0

Grazie! Questo spiega Sinatra :: Application.instance_variables parte dove ottengo @routes da esso. C'è anche [: @conditions,: @routes,: @filters,: @errors,: @middleware,: @prototype,: @extensions,: @templates] anche se devo ancora capire come usarli. Forse dovrei chiedere come una domanda? –

1

Ecco un compito rastrello per produrre un elenco di percorsi:

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 

uscita:

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