2012-03-11 14 views
19

Basit soru: config.ru'daki sinatra uygulamasına seçenekleri aktarabilmek istiyorum. Bu nasıl mümkün olabilir? Benim config.ru şöyle görünür:Argümanları yeni sinatra uygulamasına geçirin

run MyApp 

Ama argümanları almak benim Uygulamam sınıfında bu istiyorum:

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

Ama bunu yapmanın bir yolunu olamaz. Fikirler? Kullanım 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 
  • cevap

    23
    1. bir yapılandırma dosyası kullanın. contrib Sinatra::ConfigFile (aynı zamanda YAML dosyasından set ve ayarları ancak yükleri params kullanır) Bkz

    +0

    . Teşekkürler! – Ronze

    +2

    Dolayısıyla, farklı uygulamalarda yapılandırılmış tek bir uygulamanın birkaç sürümüne sahip olamıyorum? – andreypopp

    5

    , seni bu yapabileceğini anladım parametreleri içeren yapılandırmak istiyorsanız:

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

    'config AwesomeApp.new (app, bootstrap: true) 'komutunu kullanacaksınız. Sınıfınızı ya da sınıfınızın bir örneğini geçirebilmenizin sebebi, 'Sinatra :: Base', 'new.call (env)' olarak adlandırılan bir 'class' yöntemi ile gelir. https://github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb#L1485 – phylae

    1

    rnicholson's response çoğu durumda en iyi cevap olacak ama ne istediğiniz yolları bir örnek değişkeni erişmesini ise Sinatra README açıklandığı gibi, sen before filtre kullanarak bu ayarlayabilirsiniz:

    Filtreler, her istek öncesinde, rotalar ile aynı içerik içerisinde değerlendirilmeli ve istek ve yanıtı değiştirebilmelidir. filtrelerinde ayarladığınız örnek değişkenleri yolları ve şablonlar tarafından erişilebilir: Ben arıyordu Tam olarak ne

    before do 
        @note = 'Hi!' 
        request.path_info = '/foo/bar/baz' 
    end 
    
    get '/foo/*' do 
        @note #=> 'Hi!' 
        params['splat'] #=> 'bar/baz' 
    end