2012-12-04 14 views
14

Say mam:Jak uzyskać listę wszystkich tras używanych w aplikacji Sinatra?

require 'sinatra' 

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

Czy istnieje łatwy sposób uzyskać listę wszystkich zdefiniowanych tras w mojej aplikacji Sinatra?

Przeprowadziłem dochodzenie w sprawie Sinatra::Base.routes, ale wydaje się, że nie zawiera ono zdefiniowanych przeze mnie tras.

Miałem nadzieję, aby mieć ładny sposób, aby samo dokumentowanie API jak routes.each { |r| p r } dostać:

/ 
/a 
/b 

Odpowiedz

27

Należy zbadać Sinatra::Application.routes, który zawiera swoje trasy. Drukuje wyrażenia regularne wzory swoich tras:

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 

Żeby było prościej, wziąć spojrzeć na przedłużenie sinatra-advanced-routes. To daje piękny API dla introspekcję trasy:

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 

Zobacz README Sinatry-zaawansowanym trasach więcej dokumentacji i przykładów.

+0

Dzięki! To wyjaśnia część Sinatra :: Application.instance_variables, skąd otrzymuję z niej @routes. Istnieje również [: @conditions,: @routes,: @filters,: @errors,: @middleware,: @prototype,: @extensions,: @templates], chociaż muszę jeszcze zrozumieć, jak z nich korzystać. Może powinienem zadać pytanie? –

1

Oto zadanie natarcia do wyjścia listę tras:

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 

wyjściowa:

GET /asset/:id 
    HEAD /asset/:id 
    POST /asset/:aggregate_id/provide 
OPTIONS /asset 
Powiązane problemy