2010-06-01 12 views
17

En ce moment, je fais unObtenir l'URL absolue (de base) dans sinatra

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

pour pouvoir utiliser options.base_url dans le index.haml HAML. Mais je suis sûr qu'il y a un meilleur, DRY, façon de faire cela. Pourtant je ne peux pas voir, ni le trouver. (Je suis nouveau à Sinatra :))

D'une certaine manière, en dehors de obtenir, je n'ai pas request.env disponible, ou alors il semble. Donc, le mettre dans un include n'a pas fonctionné.

Comment obtenez-vous votre URL de base?

+0

Comment est 'options.base_url' pas SEC? – Adrian

Répondre

24

Un couple de choses.

  1. set est une méthode de niveau de classe, ce qui signifie que vous modifiez l'ensemble de l'état de l'application à chaque demande
  2. Ce qui précède est un problème parce que potentiellement, l'url de base pourrait être différente sur les demandes différentes, par exemple http://foo.com et https://foo.com ou si vous avez plusieurs domaines pointé sur le même serveur d'applications utilisant DNS

une meilleure tactique pourrait consister à définir une aide

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

Si vous avez besoin de l'URL de base en dehors de répondre aux requêtes (pas dans un bloc get/post/put/delete ou une vue), il serait préférable de le définir manuellement quelque part.

+0

Merci. J'ai lu sur les aides, mais je n'ai pas été assez loin pour plonger dans cette profondeur. Merci. Il semble que la réponse était là :) – berkes

34

Vous pouvez l'obtenir à l'aide request.base_url aussi = D (jetez un oeil à rack/request.rb)

+2

Cela ressemble à la meilleure façon, puisque le code source fait fondamentalement ce que l'autre suggère suggère de faire manuellement et inclut IMPORTANTMENT le port facultativement si ce n'est pas par défaut – stujo