2010-06-01 17 views
17

In questo momento, faccio unGet assoluta url (base) in Sinatra

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

per essere in grado di utilizzare options.base_url nel index.haml HAML. Ma sono sicuro che c'è un modo molto migliore, ASCIUTTO, per farlo. Eppure non posso vedere, né trovarlo. (Sono nuovo di Sinatra :))

In qualche modo, al di fuori di get, non ho request.env disponibile, o così sembra. Quindi inserirla in una confezione non ha funzionato.

Come si ottiene l'URL di base?

+0

Come è 'non options.base_url' secco? – Adrian

risposta

24

Un paio di cose.

  1. set è un metodo livello di classe, che significa che si sta modificando lo stato dell'intero applicazione con ogni richiesta Quanto sopra
  2. è un problema perché potenzialmente, l'URL di base potrebbe essere diverso su diverse richieste esempio http://foo.com e https://foo.com o se avete più domini puntato allo stesso server di applicazione utilizzando DNS

una tattica migliore potrebbe essere quella di definire un aiutante

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

Se è necessario l'url di base al di fuori di rispondere alle query (non in un blocco get/post/put/delete o una vista), sarebbe meglio impostarlo manualmente da qualche parte.

+0

Grazie. Ho letto di aiutanti, ma non sono arrivato abbastanza lontano per immergermi così profondamente. Grazie. Sembra che ci fosse la risposta :) – berkes

34

Si può ottenere usando request.base_url troppo = D (date un'occhiata a rack/request.rb)

+2

Questo sembra il modo migliore, dal momento che il codice sorgente fa sostanzialmente quello che l'altra risposta suggerisce di fare manualmente e IMPORTANTAMENTE include la porta facoltativamente se non è predefinita – stujo