2011-06-11 5 views
9

Estoy intentando generar una lista de todas las rutas generadas por mi subclase de Grape :: API (MyApi).Acceso a las rutas compiladas en Grape/Rack :: Mount :: Route

puedo acercarme llamando:

MyApi.send(:route_set).instance_variable_get(:@routes) 

que me da una gran variedad de objetos del estante :: :: Monte de ruta.

El único atributo del objeto de ruta que es útil es: condiciones que devuelve un hash de esta manera:

:path_info => (?-mix:\\A\\/api\\/(?<version>v1)\\/token(?:\\.(?<format>[^\\/]+))?\\Z)", "k: request_method, v: (?-mix:\\AGET\\Z) 

Como se puede ver el valor del hash es una expresión regular para hacer coincidir el camino de la ruta. También puedo usar: named_captures para obtener todas las capturas con nombre propio desde la expresión regular:

{:path_info=>{:version=>0, :format=>1}, :request_method=>{}} 

En última instancia lo que estoy tratando de hacer es generar una lista de todas las rutas creadas a través de uva :: API, su plena ruta, etc. . No tiene sentido para mí intentar y deconstruir la expresión regular en condiciones. ¿Hay alguna otra forma de acceder/generar una ruta legible para Rack :: Mount :: Route?

Respuesta

7

Ver este post rake routes with grape

, básicamente, usted puede obtener rutas con:

MyApi.routes 

ACTUALIZACIÓN:

artículo en Inglés: rake routes command on grape gem

+0

ese enlace está caído, y es para un dominio .xxx? Hmmm –

+1

Sí, está abajo @sardaukar, pero puede acceder aquí http: //hermes-vertigem.herokuapp.com/2013/04/02/rake-routes-no-grape/Me fijo en la respuesta, Thankx – Duke

1

¿Cómo lo hice:

desc "Print out routes" 
task :routes => :environment do 
    StudyTube::API::V1::Base.routes.each do |route| 
    info = route.instance_variable_get :@options 
    description = "%-40s..." % info[:description][0..39] 
    method = "%-7s" % info[:method] 
    puts "#{description} #{method}#{info[:path]}" 
    end 
end 

Se imprime muy bien. Estuve dando vueltas con el truncamiento, pero puedes deshacerte de eso si quieres, por supuesto.

2

Solo para agregar otra variación a las respuestas aquí. Yo uso las siguientes dos tareas de rake.

task :all_routes => [:routes, :api_routes] 

task :api_routes => :environment do 
    longest_uri = MyAPI.routes.map{|api|api.route_path.length}.max 
    longest_desc = MyAPI.routes.map{|api|api.route_description.length}.max 
    pattern = "%10s %-#{longest_uri}s %-#{longest_desc}s\n" 

    # print column headers 
    printf(
    pattern, 
    "Verb", "URI Pattern", "Description" 
) 

    # print each column 
    MyAPI.routes.each do |api| 
    printf(
     pattern, 
     api.route_method, api.route_path, api.route_description 
    ) 
    end 
end 
0

Me gustaría ir con una de las tareas personalizadas de rake si no está utilizando Rails. Si de hecho está utilizando Rails, eche un vistazo al grape-rails-routes gem.

Le da una tarea de rastrillo similar rake routes_with_grape. Sin embargo el valor

Se añadió es la vista de tabla HTML en la sección de información carriles en http://localhost:3000/rails/info/routes_with_grape

2

Si está utilizando la uva con los carriles, echa un vistazo a la gema grape_on_rails_routes.

Puede ejecutar rake grape:routes y ver una lista muy bien formateada de todas las API actuales y sus detalles (url, descripción, versión).

+0

Si bien este enlace puede responder a la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. - [De la crítica] (/ crítica/mensajes de baja calidad/11712383) – RickyA

+0

@RickyA gracias por los comentarios, acaba de actualizar la respuesta! –

+0

Este método es mejor porque no se basa en el nombre del proyecto, sino que busca en ObjectSpace toda la herencia de Grape :: API. –

Cuestiones relacionadas