Lorsque vous définissez, dans une application rails, des url spécifiques avec map.resources, celles-ci finissent de la forme suivante :
/post/1
Ou 1 est l’identifiant de l’uplet dans la base et blog est le nom de la ressource. C’est cool parce que ça permet d’avoir des url assez courtes simplement.
Mais d’un point de vue utilisateur, y’a mieux. Avoir une url du genre de
/post/titre-du-billet
Serait un peu mieux non ? C’est particulièrement simple
Map.resources utilise la méthode to_param des modèles. Méthode qui, par défaut, retourne la valeur de l’identifiant.
Si vous la modifiez en placant :
def to_param
title
end
Ce n’est plus l’identifiant de votre uplet qui sera retourné mais la valeur du champ titre.
A vous donc ensuite d’avoir un titre correct.
Et lorsque vous appellerez la méthode vous permettant d’avoir l’url vers votre billet :
post_url @post
Ce n’est plus /post/1 qui sera retourné mais /post/titre-de-votre-billet.
Bien évidemment la valeur de title doit être correctement formatée pour rendre une url (suppression des accents et espaces etc). Rails ne fait pas cela automatiquement.
Mais ce genre de méthode ne fait pas partie du sujet de cet article. Cela sera pour un autre
Les routes rails permettent de faire des choses particulièrement avancées.
Cependant une limite de la chose est qu’il est impossible, en natif, de créer des routes spécifiques à un domaine ou sous-domaine.
Avoir une route valide pour fr.example.com mais pas pour en.example.com par exemple.
Nous allons voir dans cet article comment implémenter ceci.
Pour cela, nous avons besoin d’un plugin, foreign domain routing.
Téléchargez le et placer son répertoire dans vendor/plugins.
Maintenant nous allons pouvoir ajouter une vérification sur le domaine ou le sous-domaine dans les routes.
Ecrivons-en une :
map.resources :contents, :conditions => { :subdomain => 'fr' }
Notre route ne sera valide que si l’on est sur le sous-domaine fr.
Ainsi, fr.example.com aura cette route. Ainsi que fr.www.example.com.
Mais pas www.fr.example.com ni www.example.com.
Vous pouvez faire la même chose avec le domaine :
map.resources :contents, :conditions => { :domain => 'fr.example.com' }
Seul le domaine fr.example.com contiendra cette route.
Maintenant, si vous avez de nombreuses routes, comme c’est probablement le cas, vous allez rapidement vous rendre compte que ceci rends votre routes.rb illisible.
C’est pourquoi nous allons utiliser with_options.
map.with_options :conditions => { :domain => 'fr.example.com' } do |opt|
opt.resources :contents
end
Notre route ne sera créée que si nous sommes sur le domaine fr.example.com. Et vous pouvez placer autant de routes que vous le désirez dans la boucle de la méthode with_options.
Sans ce plugin, seule la condition :method est disponible. Cependant avec celui-ci, sont rendues disponibles les conditions suivantes :
- :subdomain – Le premier sous-domaine (avant le premier . (point)).
- :domain – Le domaine entier
- :method – La méthode d’appel à la page (:get, :post, :put, :delete)
- :port – Le port (80)
- :remote_ip – L’ip de l’utilisateur
- :content_type – Valeur content_type de l’entête http
- :accepts
- :request_uri – L’url entière
- :protocol – Le protocole (http ou https)
-
