2012-03-08 12 views
6

Estoy tratando de usar el estilo de subclases en la aplicación Sinatra. Entonces, tengo una aplicación principal como esta.¿Cómo config.ru correctamente en la aplicación modular de Sinatra?

class MyApp < Sinatra::Base 
    get '/' 
    end 

    ... 
end 

class AnotherRoute < MyApp 
    get '/another' 
    end 

    post '/another' 
    end 
end 
run Rack::URLMap.new \ 
    "/"  => MyApp.new, 
    "/another" => AnotherRoute.new 

En config.ru entiendo que es sólo para "obtener" ¿qué hay de otros recursos (por ejemplo, "PUT", "POST")? No estoy seguro de si me estoy perdiendo algo obvio. Y también si tengo diez path (/ path1,/path2, ...) ¿tengo que configurarlos todos en config.ru a pesar de que están en la misma clase?

+0

¿Por qué usted quiere tener diferente clase por camino? ¿Por qué no puedes tener todas las asignaciones de URL en MyApp? – ch4nd4n

+0

Solo quiero que sea más fácil separarme porque mi aplicación se está haciendo más grande y no quiero desplazarme hacia arriba y hacia abajo todo el tiempo. – toy

+0

¿Has echado un vistazo a [padrino] (http://www.padrinorb.com/)? Es un envoltorio ** flexible ** en la parte superior de Sinatra. – ch4nd4n

Respuesta

4

Con URLMap especifica una url base donde se debe montar la aplicación. La ruta especificada en el mapa no se usa para determinar qué ruta usar dentro de la aplicación. En otras palabras, la aplicación actúa como si su raíz es después de la ruta utilizada en URLMap.

Por ejemplo, el código será responder a las siguientes rutas:

  • /: serán enviados a la ruta / en MyApp

  • /another: irá a la ruta / en AnotherRoute. Dado que AnotherRoute se extiende a MyApp, será el mismo que / en MyApp (pero en una instancia diferente).

    URLMap ve /another y lo utiliza para asignar a AnotherRoute, eliminando esta parte de la solicitud de la ruta de acceso. AnotherRoute entonces solo ve /.

  • /another/another: se enrutarán a las dos rutas /another en AnotherRoute. Nuevamente, el URLMap utiliza el primer another para enrutar la solicitud al AnotherRoute. AnotherRoute entonces solo ve el segundo another como la ruta.

    Tenga en cuenta que esta ruta responderá a las dos solicitudes GET y POST, cada una de las cuales será gestionada por el bloque apropiado.

No está claro lo que estamos tratando de hacer, pero creo que se puede lograr lo que quiere mediante la ejecución de una instancia de AnotherRoute, con un config.ru que es justo:

run AnotherRoute.new 

Desde AnotherRoute extiende MyApp, se definirá la ruta /.

Si está buscando una forma de agregar rutas a una aplicación Sinatra existente, podría create a module with an included method that adds the routes, en lugar de usar la herencia.

15

app.rb

class MyApp < Sinatra::Base 
    get '/' 
    end 
end 

app2.rb Si quieres dos archivos separados. Tenga en cuenta que esto hereda de Sinatra :: Base no MyApp.

class AnotherRoute < Sinatra::Base 
    get '/' 
    end 

    post '/' 
    end 
end 

El config.ru

require 'bundler/setup' 
Bundler.require(:default) 

require File.dirname(__FILE__) + "/lib/app.rb" 
require File.dirname(__FILE__) + "/lib/app2.rb" 


map "/" do 
    run MyApp 
end 

map "/another" do 
    run AnotherRoute 
end 
Cuestiones relacionadas