2010-06-01 23 views
17

En este momento, hago unobtener la URL absoluta (base) en Sinatra

get '/' do 
    set :base_url, "#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}" 
    # ... 
    haml :index 
end 

para poder utilizar options.base_url en el index.haml HAML. Pero estoy seguro de que hay una manera mucho mejor, DRY, de hacer esto. Sin embargo, no puedo ver ni encontrarlo. (Soy nuevo en Sinatra :))

De alguna manera, fuera de obtener, no tengo request.env disponible, o eso parece. Entonces ponerlo en una inclusión no funcionó.

¿Cómo se obtiene su url base?

+0

Cómo es 'no options.base_url' seco? – Adrian

Respuesta

24

Un par de cosas.

  1. set es un método nivel de clase, lo que significa que está modificando el estado de toda la aplicación con cada solicitud
  2. Lo anterior es un problema porque, potencialmente, la url base podría ser diferente en diferentes solicitudes, por ejemplo http://foo.com y https://foo.com o Si tiene varios dominios apuntando al mismo servidor de aplicaciones utilizando DNS

una táctica mejor podría ser la definición de un ayudante

helpers do 
    def base_url 
    @base_url ||= "#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}" 
    end 
end 

Si necesita la url base fuera de responder a consultas (no en un bloque get/post/put/delete o una vista), sería mejor configurarla manualmente en alguna parte.

+0

Gracias. Leí sobre ayudantes, pero no llegué lo suficiente como para profundizar en eso. Gracias. Parece que la respuesta estaba allí :) – berkes

34

Se puede conseguir usando request.base_url demasiado = D (echar un vistazo a rack/request.rb)

+2

Esto parece la mejor manera, ya que el código fuente básicamente hace lo que la otra respuesta sugiere hacer manualmente y IMPORTANTE incluye el puerto opcionalmente si no es el predeterminado – stujo

Cuestiones relacionadas