2012-12-04 5 views
14

Sagen, ich habe:Wie bekomme ich eine Liste aller Routen, die in einer Sinatra App verwendet werden?

require 'sinatra' 

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

Gibt es eine einfache Möglichkeit, eine Liste aller definierten Routen in meiner Sinatra Anwendung zu erhalten?

Ich untersuchte Sinatra::Base.routes, aber das scheint nicht die Routen zu enthalten, die ich gerade definiert habe.

Ich hatte gehofft, einen schönen Weg, um eine selbstdokumentiere API wie routes.each { |r| p r } zu machen zu bekommen:

/ 
/a 
/b 

Antwort

27

Sie Sinatra::Application.routes untersuchen sollte, die Ihre Routen enthält. Dies druckt die reguläre Ausdrücke Ihrer Route Muster:

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 

Um die Dinge einfacher zu machen, nehmen Sie an der Verlängerung sinatra-advanced-routes aussehen. Es gibt Ihnen eine schöne API für die Routen introspecting:

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 

die README von sinatra-advanced-Routen für mehr Dokumentation und Beispiele.

+0

Dank! Das erklärt Sinatra :: Application.instance_variables Teil, wo ich @routes davon bekomme. Es gibt auch [: @conditions,: @routes,: @ filters,: @errors,: @middleware,: @prototype,: @extensions,: @templates], obwohl ich noch nicht verstanden habe, wie man diese auch verwendet. Vielleicht sollte ich als Frage fragen? –

1

Hier ist eine Harke Aufgabe, eine Liste von Routen zur Ausgabe:

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 

Ausgang:

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