2012-03-08 9 views
6

Sto provando a usare lo stile di sottoclasse nell'applicazione Sinatra. Quindi, ho un'app principale come questa.Come config.ru correttamente nell'applicazione modulare 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 

In config.ru ho capito che è solo per "GET" Che ne dici altre risorse (ad esempio, "PUT", "POST")? Non sono sicuro che mi manchi qualcosa di ovvio. E anche se ho dieci path (/ path1,/path2, ...) devo configarli tutti in config.ru anche se sono nella stessa classe?

+0

Perché si vuole avere classe diversa per percorso? Perché non puoi avere tutte le mappature URL in MyApp? – ch4nd4n

+0

Voglio semplificare la separazione perché la mia app si sta ingrandendo e non voglio scorrere su e giù per tutto il tempo. – toy

+0

Hai dato un'occhiata a [padrino] (http://www.padrinorb.com/)? È piuttosto un ** flessibile ** involucro in cima a Sinatra. – ch4nd4n

risposta

4

Con URLMap si specifica un url di base in cui l'app deve essere montata. Il percorso specificato nella mappa non viene utilizzato per determinare quale percorso utilizzare all'interno dell'app stessa. In altre parole, l'app funziona come se fosse root dopo il il percorso utilizzato in URLMap.

Per esempio, il codice risponderà ai seguenti percorsi:

  • /: verranno indirizzate al percorso / in MyApp

  • /another: andrà alla rotta / in AnotherRoute. Dal AnotherRoute estende MyApp questo sarà lo stesso di / in (ma in un'istanza diversa).

    URLMap vede /another e lo utilizza per mappare a AnotherRoute, eliminando questa parte della richiesta dal percorso. AnotherRoute quindi vede solo /.

  • /another/another: verrà instradato ai due instradamenti /another in AnotherRoute. Anche in questo caso, il primo another viene utilizzato da URLMap per instradare la richiesta a AnotherRoute. AnotherRoute quindi visualizza solo il secondo another come percorso.

    Si noti che questo percorso risponderà a entrambe le richieste GET e POST, ciascuna gestita dal blocco appropriato.

Non è chiaro quello che stai cercando di fare, ma penso che si può ottenere quello che vuoi eseguendo un'istanza di AnotherRoute, con un config.ru che è solo:

run AnotherRoute.new 

Dal AnotherRoute estende , la route / sarà definita per questo.

Se si sta cercando un modo per aggiungere percorsi a un'applicazione Sinatra esistente, è possibile utilizzare create a module with an included method that adds the routes anziché utilizzare l'ereditarietà.

15

app.rb

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

app2.rb Se si desidera che due file separati. Nota questo eredita da Sinatra :: Base non MyApp.

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

    post '/' 
    end 
end 

Il 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 
Problemi correlati