Ronze
Ronze

Reputation: 1574

Pass arguments to new sinatra app

Simple question: I want to be able to pass options into my sinatra app in config.ru. How is that possible? My config.ru looks like this:

run MyApp

But I want to have this in my MyApp class to take arguments:

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

But I can't figure out a way to do this. Ideas?

Upvotes: 21

Views: 7118

Answers (3)

pyrmont
pyrmont

Reputation: 231

rnicholson's response will be the best answer in most cases but if what you want is to have access to an instance variable in your routes, you can set these up using the before filter as explained in the Sinatra README:

Before filters are evaluated before each request within the same context as the routes will be and can modify the request and response. Instance variables set in filters are accessible by routes and templates:

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

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

Upvotes: 1

Kasper Grubbe
Kasper Grubbe

Reputation: 943

If you want to configure with params, I figured out that you could do this:

require 'sinatra/base'

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

Upvotes: 5

rnicholson
rnicholson

Reputation: 4588

  1. Use 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. Use a config file. See Sinatra::ConfigFile in contrib (which also uses set and settings, but loads params from a YAML file)

Upvotes: 26

Related Questions