2012-03-11 2 views
19

Простой вопрос: я хочу иметь возможность передавать параметры в мое приложение sinatra в config.ru. Как это возможно? Мой config.ru выглядит следующим образом:Передайте аргументы новому приложению sinatra

run MyApp 

Но я хочу, чтобы это в моем классе MyApp принять аргументы:

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

Но я не могу понять способ сделать это. Идеи?

ответ

23
  1. Использование 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. Используйте конфигурационный файл. См Sinatra::ConfigFile в вно (который также использует набор и настройки, но нагрузки Params из файла YAML)

+0

Именно то, что я искал. Благодаря! – Ronze

+2

Итак, у меня не может быть несколько версий отдельных приложений, настроенных по-разному? – andreypopp

5

Если вы хотите настроить с Params, я понял, что вы могли бы сделать это:

require 'sinatra/base' 

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

В config.ru вы должны использовать 'run AwesomeApp.new (app, bootstrap: true)'. Причина, по которой вы можете передать свой класс или экземпляр вашего класса, состоит в том, что 'Sinatra :: Base' поставляется с методом класса' call' с по существу вызовами 'new.call (env)'. https://github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb#L1485 – phylae

1

rnicholson's response будет лучшим ответом в большинстве случаев, но если то, что вы хотите, чтобы иметь доступ к переменной экземпляра в ваших маршрутов, вы можете настроить их с помощью before фильтра, как описано в Sinatra README:

Прежде чем фильтры будут оцениваться перед каждым запросом в том же контексте, что и маршруты, и могут изменять запрос и ответ. Переменные экземпляра, установленные в фильтрах доступны по маршрутам и шаблоны:

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

get '/foo/*' do 
    @note #=> 'Hi!' 
    params['splat'] #=> 'bar/baz' 
end 
Смежные вопросы