2010-06-01 4 views
17

Gerade jetzt, ich einErhalten Sie absolute (Basis) url in sinatra

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

der Lage sein, options.base_url im HAML index.haml zu verwenden. Aber ich bin mir sicher, es gibt eine viel bessere, trockene Art, dies zu tun. Doch ich kann es nicht sehen und finde es auch nicht. (Ich bin neu in Sinatra :))

Irgendwie außerhalb bekommen, ich habe keine Anfrage.env verfügbar, oder so scheint es. Es hat also nicht funktioniert, es in ein Include zu setzen.

Wie erhalten Sie Ihre Basis-URL?

+0

Wie ist 'options.base_url' nicht trocken? – Adrian

Antwort

24

Ein paar Dinge.

  1. set ist eine Klasse-Level-Methode, das bedeutet, dass Sie bei jeder Anfrage der gesamten App-Zustand modifizieren
  2. Die oben sind ein Problem, weil möglicherweise könnte die Basis-URL auf unterschiedliche Anforderungen unterschiedlich sein, zB http://foo.com und https://foo.com oder wenn Sie in der gleichen App-Server mehrere Domänen mit DNS zeigte

Eine bessere Taktik könnte ein Helfer

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

Wenn Sie die Basis-URL außerhalb der Antwort auf Abfragen benötigen (nicht in einem Get/Post/Put/Delete-Block oder einer Ansicht), wäre es besser, sie irgendwo manuell einzustellen.

+0

Danke. Ich habe von Helfern gelesen, bin aber nicht weit genug gekommen, um so tief hinein zu tauchen. Vielen Dank. Es scheint, dass die Antwort da war :) – berkes

34

Sie können es request.base_url mit bekommen zu = D (bei rack/request.rb einen Blick)

+2

Das sieht nach dem besten Weg aus, da Quellcode im Grunde genommen das tut, was die andere Antwort vorschlägt, manuell zu tun, und WICHTIG den Port optional einschließt, wenn er nicht voreingestellt ist – stujo