2012-03-11 11 views
19

Pregunta simple: Quiero poder pasar opciones a mi aplicación de sinatra en config.ru. ¿Cómo es eso posible? Mi config.ru se ve así:Pasar argumentos a la nueva aplicación de sinatra

run MyApp 

Pero yo quiero tener esto en mi clase MiApl a tomar argumentos:

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

, pero no puedo encontrar una manera de hacer esto. Ideas?

Respuesta

23
  1. Uso 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. utilizar un archivo de configuración. Ver Sinatra::ConfigFile en contrib (que también utiliza set y configuración, pero hay muchos parametros de un archivo YAML)

+0

Exactamente lo que estaba buscando. ¡Gracias! – Ronze

+2

¿De modo que no puedo tener varias versiones de una sola aplicación configuradas de diferentes maneras? – andreypopp

5

Si desea configurar con params, me di cuenta de que se podía hacer esto:

require 'sinatra/base' 

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

En config.ru usaría 'ejecutar AwesomeApp.new (app, bootstrap: true)'. La razón por la que puede aprobar su clase o una instancia de su clase es que 'Sinatra :: Base' viene con un método de clase' call' con llamadas esencialmente 'new.call (env)'. https://github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb#L1485 – phylae

1

rnicholson's response será la mejor respuesta en la mayoría de los casos, pero si lo que quiere es tener acceso a una variable de instancia en sus rutas, puede establecer estas arriba usando el filtro before como se explica en el Sinatra README:

Antes de que los filtros se evalúen antes de cada solicitud en el mismo contexto que las rutas, y pueden modificar la solicitud y la respuesta. las variables de instancia asignadas en los filtros son accesibles por las rutas y las plantillas:

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

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