2012-03-11 10 views
19

Domanda semplice: voglio essere in grado di passare le opzioni nella mia app sinatra in config.ru. Come è possibile? Il mio config.ru assomiglia a questo:Passare argomenti alla nuova app sinatra

run MyApp 

Ma io voglio avere questo nella mia classe MyApp prendere argomenti:

class MyApp < Sinatra::Base 
    def initialize(config) 
    @config = config 
    end 
end 

Ma io non riesco a capire un modo per fare questo. Idee?

risposta

23
  1. Usa set/settings

    require 'sinatra/base' 
    
    class MyApp < Sinatra::Base 
        get '/' do 
        settings.time_at_startup.to_s 
        end 
    end 
    
    # Just arbitrarily picking time as it'll be static but, diff for each run. 
    MyApp.set :time_at_startup, Time.now 
    
    run MyApp 
    
  2. Utilizzare un file di configurazione. Vedere Sinatra::ConfigFile in contrib (che utilizza anche serie e le impostazioni, ma carichi params da un file YAML)

+0

Esattamente quello che stavo cercando. Grazie! – Ronze

+2

Quindi non posso avere diverse versioni di una singola app configurate in modi diversi? – andreypopp

5

Se si desidera configurare con params, ho capito che si potrebbe fare questo:

require 'sinatra/base' 

class AwesomeApp < Sinatra::Base 
    def initialize(app = nil, params = {}) 
    super(app) 
    @bootstrap = params.fetch(:bootstrap, false) 
    end 
end 
+0

In config.ru dovresti usare 'run AwesomeApp.new (app, bootstrap: true)'. Il motivo per cui puoi passare la tua classe o un'istanza della tua classe è che "Sinatra :: Base" viene fornito con un metodo di classe 'call' con essenzialmente chiamate' new.call (env) '. https://github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb#L1485 – phylae

1

rnicholson's response sarà la migliore risposta nella maggior parte dei casi, ma se quello che vuoi è quello di avere accesso a una variabile di istanza nei vostri percorsi, è possibile impostare questi utilizzando il filtro before come spiegato nel Sinatra README:

Prima che i filtri vengano valutati prima di ogni richiesta nello stesso contesto dei percorsi, è possibile modificare la richiesta e la risposta. Le variabili di istanza impostati nei filtri sono accessibili tramite percorsi e modelli:

before do 
    @note = 'Hi!' 
    request.path_info = '/foo/bar/baz' 
end 

get '/foo/*' do 
    @note #=> 'Hi!' 
    params['splat'] #=> 'bar/baz' 
end 
Problemi correlati