2009-07-17 6 views
1

J'ai récemment commencé à utiliser le concombre & sous-domaine-fu ensemble, et cela m'a fait faire des choses terribles.Obtenir le concombre et Subdomain-fu pour jouer ensemble bien

J'ai une définition étape qui sert à ressembler à ceci:

path = grok_path(path) 
get path 

C'est agréable et facile, à mon avis. Mais maintenant il est ceci:

path = grok_path(path) 
get "http://#{subdomain}.example.com#{path}" 

Ce fonctionne, mais il est pas tout à fait propre. Quelle est la meilleure façon de faire cela?

Répondre

2

Juste pour faire des définitions étape plus lisible, vous pouvez envelopper ce genre de choses dans une petite méthode, comme suit:

def subdomained_path(path, subdomain): 
    return "http://#{subdomain}.example.com#{path}" 
end 

Ce qui vous permet de ranger vos définitions étape dans quelque chose comme:

path = grok_path(path) 
get subdomained_path(path, subdomain) 

Fonctionnellement, les deux sont équivalents (et également hacky), mais les changements que j'ai suggérés vont au moins rendre le code un peu plus propre. Si vous avez accès à modifier Net :: HTTP.get, vous pouvez modifier la méthode "get" actuelle pour accepter un argument de sous-domaine, le rendant encore plus propre.

+0

Cela ressemble beaucoup mieux, merci! Je ne suis pas complètement content, mais c'est le meilleur que j'ai vu jusqu'ici. –

2

Je ne suis pas sûr de savoir comment cela s'applique au concombre (en utilisant Shoulda ici), mais après avoir essayé quelques recommandations ailleurs, cela semble fonctionner de manière fiable:

def in_subdomain(str) 
    # test.host == default testing domain, feel free to change to match your usage 
    @request.host = "#{str}.test.host" 
end 

Et puis avant d'appeler get, vous juste besoin de vous assurer que vous êtes in_subdomain('subdomain-fuuuuuu'). Cela définit correctement l'URL et current_subdomain au moins (je n'ai pas vérifié tout), redirige sans spécifier de sous-domaine rester dans le sous-domaine, et les redirections vers d'autres sous-domaines (ou :subdomain => false) définissent toujours la bonne valeur redirected_to.

Ces (haute qualité, je suis sûr que vous pouvez dire) les tests passent, par exemple, et ils ont un contrôle sur current_subdomain dans le contrôleur:

should "show on the owner's subdomain" do 
    in_subdomain(@user.domain) 
    get :show, :id => @user.things.first.id 
    assert_response :success 
end 
should "not show on another users' subdomain" do 
    in_subdomain(@random_user.domain) 
    get :show, :id => @user.things.first.id 
    assert_redirected_to user_url(@random_user, :subdomain => @random_user.domain) 
end 
should "not show on a non-existent subdomain" do 
    in_subdomain("cthulhu-fhtagn") 
    get :show, :id => @user.things.first.id 
    assert_redirected_to root_url(:subdomain => false) 
end 
Questions connexes