2012-01-18 9 views
5

Me gustaría poder recuperar la URL base de mi aplicación web desde el código de inicialización del Rack en mi config.ru. Algo a lo largo de las líneas de:¿Puedo obtener la URL base de mi servicio Rack fuera de un controlador de solicitud?

puts "Starting up on http://#{ENV['SERVER_NAME']}:#{ENV['SERVER_PORT']}/#{ENV['MOUNT_POINT']}..." 

pero no he encontrado nada como esto que está disponible desde el exterior de un controlador de solicitudes. Obviamente, puedo hacer algo como:

... 
def get 
    puts "Got a request for #{ENV['rack.url_scheme']}://#{ENV['HTTP_HOST']}#{ENV['REQUEST_PATH']}" 
    ... 

porque la solicitud se define en ese punto. Pero al comienzo de mi archivo de configuración, ninguna de esas variables parece estar definida.

¿Existe algún método de Rack que pueda usarse para acceder a esta información? ¿Este es uno de esos casos en los que esas cosas no se finalizan hasta que finaliza el inicio del Rack? Me parece recordar otros frameworks que tienen una forma de pasar un proceso a un método que lo ejecutará una vez que el entorno esté "listo". ¿Rack tiene algo así?

+0

¿Qué intentas establecer en config.ru que necesita esta información? – nictrix

+0

No estoy intentando * establecer * nada, solo creo que es bueno que el registro muestre dónde se encuentra el servicio; es especialmente útil cuando un desarrollador nuevo prueba por primera vez. – Coderer

Respuesta

2

No creo que sea posible que una aplicación de Rack pueda conocer de antemano el "punto de montaje". Por ejemplo, este config.ru monta la misma aplicación en diversos puntos de montaje:

require 'rack' 

app = proc { |env| 
    [200, {'Content-Type' => 'text/plain'}, ['hello, world!']] 
} 

run Rack::URLMap.new('/myapp' => app, 
        '/' => app) 

Rack también no proporciona ningún método estándar que se llama en tiempo de inicialización. Sospecho que esto se debe a que Rack intenta soportar un CGI simple, donde se puede crear todo un proceso de Ruby para manejar cada solicitud, y el proceso sale en cada solicitud. En esa situación, no hay mucho uso para un método "init".

2

Se trata de un año más tarde, pero yo estaba luchando con el mismo problema y encontré su hilo.

Cada aplicación Rack proporciona un método de llamada al que llama el controlador de Rack. Por ejemplo, vea el código de llamada de Sinatra :: Base #. Este método de llamada se llama una vez por solicitud y tiene un parámetro que es un hash que contiene variables de entorno. Dentro de estos, hay todo lo que necesita y el "punto de montaje" que estaba solicitando se llama "SCRIPT_NAME".

Ver http://www.rubydoc.info/github/rack/rack/file/SPEC para más detalles. Lamentablemente, esta información solo está disponible para usted durante una solicitud y no antes, hasta donde yo sé. Espero que ayude a otros.

Cuestiones relacionadas