将参数传递给新的sinatra app

时间:2012-03-11 17:34:26

标签: ruby sinatra rack

简单问题:我希望能够在config.ru中将选项传递到我的sinatra应用程序中。怎么可能?我的config.ru看起来像这样:

run MyApp

但是我希望在我的MyApp类中使用它来获取参数:

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

但我无法想办法做到这一点。想法?

3 个答案:

答案 0 :(得分:24)

  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. 使用配置文件。请参阅contrib中的Sinatra::ConfigFile(也使用set和settings,但从YAML文件加载params)

答案 1 :(得分:5)

如果你想配置params,我发现你可以这样做:

require 'sinatra/base'

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

答案 2 :(得分: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