2012-12-04 14 views
14

Ben olduğunu varsayalım:Sinatra uygulamasında kullanılan tüm rotaların bir listesini nasıl edinebilirim?

require 'sinatra' 

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

yolu benim Sinatra uygulamadaki tüm tanımlanmış yolların bir listesini elde etmek için herhangi bir kolay var mı?

Sinatra::Base.routes araştırdım, ancak daha önce tanımladığım yolları içermiyor.

Ben routes.each { |r| p r } gibi kendini belgeleyen API almak için yapmak için güzel bir yol var umuyordum:

/ 
/a 
/b 

cevap

27

Sen yolları içeren, Sinatra::Application.routes araştırmalısınız. Bu rota desen düzenli ifadeler yazdırır:

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 

, İşleri basitleştirmek sinatra-advanced-routes uzantısı bakmak almak. Bu güzergah introspecting için sana güzel bir API verir:

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 

daha fazla belge ve örnekler için sinatra-ileri-yollarının README bakınız.

+0

teşekkürler! Sinatra :: Application.instance_variables parçasını, buradan @routes aldığım kısmı açıklıyor. Ayrıca, [: @conditions,: @routes,: @filters,: @errors,: @middleware,: @prototype,: @extensions,: @templates]. Bunları nasıl kullanacağımı henüz anlamadım. Belki bir soru olarak sormalı mıyım? –

1

İşte çıkışına yolların bir listesini bir tırmık görevi var:

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 

Çıktı:

GET /asset/:id 
    HEAD /asset/:id 
    POST /asset/:aggregate_id/provide 
OPTIONS /asset 
İlgili konular