2011-06-27 14 views
17

Tengo una pregunta sobre el uso del montaje en bastidor con Sinatra. Tengo dos aplicaciones Sinatra de estilo clásico. Llamemos a una aplicación definida en app.rb y a la otra API definida en api.rb.Múltiples aplicaciones de Sinatra con montaje en bastidor

Me gustaría que api.rb maneje todas las rutas que comiencen con '/ api' y que app.rb maneje todas las demás solicitudes, incluida la raíz ('/').

¿Cómo puedo configurar esto con montaje en rack? ¿O hay una mejor solución que eso?

Respuesta

26

Creo que usted prefiere rack :: URLMap - que probablemente se verá algo como esto:

run Rack::URLMap.new("/" => App.new, 
        "/api" => Api.new) 

que debe ir en su archivo config.ru.

+0

Gracias! Esto funciona muy bien, aunque tuve que cambiar los corchetes a paréntesis. –

+1

Un problema que he notado con esto, sin embargo, es que las cosas en decir "/ images", "/ javascripts", etc. están siendo procesadas a través de Sinatra que no está funcionando. ¿Cómo puedo evitar eso? Me doy cuenta de esto solo usando el servidor 'delgado'. –

+0

¿Podría explicar más sobre el problema que tiene allí? – daddz

3

que tenían el mismo problema de una vez lo que ocurrió con esta plantilla: sinatra-rspec-bundler-template que está organizada para múltiples aplicaciones.

Puede tener más funciones de las que necesita, pero debería ayudarle cuando necesite algo "un poco más" complejo.

9

Tuve un problema similar y no estoy muy familiarizado con Rack. No pude entender qué hacer en base a las respuestas anteriores. Mi solución final fue tener lo siguiente en config.ru.

Esto funciona perfectamente para mí.

 
# Main Ramaze site 
map "/" do 

    Encoding.default_external = Encoding::UTF_8 
    Encoding.default_internal = Encoding::UTF_8 

    require ::File.expand_path('../app', __FILE__) 

    Ramaze.start(:root => __DIR__, :started => true) 
    run Ramaze 

end 

# Sinatra & Grape API 
map "/api" do 

    use Rack::Static, :urls => ["/stylesheets", "/images", "/javascripts"], :root => "public" 
    use Rack::Session::Cookie 

    run Rack::Cascade.new([ 
     MySinatraApp::Application, 
     MySinatraApp::API]) 

end 
+0

Esa debería ser la respuesta aceptada. File config.ru ejecutado en el espacio de nombres Rack :: Builder, que proporciona DSL para construir iterativamente aplicaciones Rack, y Rack crea automáticamente Rack :: URLMap. – 18augst

9

En config.ru también se puede aprovechar la característica de middleware de Sinatra. Si tiene varias aplicaciones de Sinatra, cada una con sus propias rutas, y desea ejecutarlas simultáneamente, puede organizarlas en el orden en que las quiere encontrar, p.

# config.ru 
... 
use MyAppA 
use MyAppB 
use MyAppC 
run MyAppD 
Cuestiones relacionadas