2012-03-11 2 views
19

간단한 질문 : config.ru에서 내 sinatra 앱에 옵션을 전달할 수 있기를 원합니다. 어떻게 가능합니까? 내 config.ru는 다음과 같습니다새로운 sinatra 앱에 인수 전달

run MyApp 

하지만 인수를 내 MyApp를 클래스에이 갖고 싶어 :

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

을하지만이 작업을 수행 할 수있는 방법을 알아낼 수 없습니다. 아이디어? 사용 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 
  • 답변

    23
    1. 는 설정 파일을 사용합니다. 있는 contrib에서 Sinatra::ConfigFile를 (또한 YAML 파일에서 설정 및 설정하지만,로드 PARAMS를 사용하는)를 참조하십시오

    +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'는 본질적으로'new.call (env)'를 호출하는'call' 클래스 메소드와 함께 제공된다는 것입니다. https://github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb#L1485 – phylae

    1

    rnicholson's response 대부분의 경우 가장 좋은 해답이 될 것입니다하지만 당신이 원하는 것은 당신의 경로에있는 인스턴스 변수에 액세스 할 경우 Sinatra README에서 설명한 바와 같이, 당신은 before 필터를 사용하여 다음을 설정할 수 있습니다

    경로가 요청 및 응답을 수정할 수있는 동일한 컨텍스트 내의 각 요청 전에 필터가 평가되기 전에. 필터에서 설정 한 인스턴스 변수는 경로 및 템플릿에 의해 액세스 할 수 있습니다 : 내가 찾던 정확히 무엇을

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