Tags: Ruby on Rails, Programmation, Ruby
Un des aspects intéressant de Ruby on Rails est la conversation d’URL en controller/action et paramètres de tout acabit. Vous pensiez que le monde arrêtait avec la configuration par défaut? Il y a bien plus que la page par défaut et la séquence :controller/:action/:id à
explorer.
Le lien attrape-tout
Pour fonctionner ce dernier doit être le dernier paramètre de l’url. Sinon autant utiliser l’autreméthode décrire plus bas. Le lien attrape tout ressemble à: map.connect ‘*path’ , :controller => ‘blog’ , :action => ‘inconnu?’ Ce code appellera la méthode inconnu? sur le contrôleur et placera dans params[:path] la totalité de l’URL. Mignon? Pratique? Surtout pratique si vous voulez-faire une page intelligente pour les URLs non-existantes. En analysant l’URL on peut guider le webnaute vers un contenu qui devrait répondre à ses besoins et ce malgré l’erreur.
Les textes prédéfinis dans l’URL
Sur un de mes derniers projets j’avais besoin de publier des textes avec l’engin de document créé chez M2i3. Pour sûr je ne voulais pas avoir des liens du style « /document/show/23 ». En plus des raisons esthétiques un tel lien diminue la valeur des pages par les engins de recherche puisque l’URL n’a aucun lien textuel avec le contenu. Pourtant faire un lien simple comme « :alias_page » aurait confondu Rails puisqu’il aurait assumé que je parle ici d’un contrôleur. Donc… l’utilisation de textes prédéfinis dans l’URL permet de résoudre ce genre de situation. Voici la configuration en question: map.connect ‘:alias_page.html’ , :controller => ‘document’ , :action => ‘show’ Je n’utilise pas l’ID puisque le nom de ma page est une chaîne de caractère que j’ai nommé « alias_page ». La beauté de cette configuration est que la méthode « url_for » construit l’url proprement. Donc dans mon code lors que je veux créer un lien vers la page dont l’alias est « a-propos-de-nous » j’utilise le code: ‘document’, :action=>’show’, :alias_page=>’a-propos-de-nous’ %> et le lien généré est « /a-propos-de-nous.html » beaucoup plus propre non???
Les routes nommées
Ce truc permet de simplifier le code en nommant la route lors de la configuration. J’ai une relation haine/amour avec cette technique puisque même si elle permet de simplifier le code elle en diminue aussi la portabilité puisque la route nommé doit exister dans l’application où l’on veut copier/utiliser le bloc de code. Donc, en reprenant le truc précédent nous pourrions le réécrire avec une route nommée comme: map.document_link ‘:alias_page.html’ , :controller => ‘document’ , :action => ‘show’ Remarquez comment on remplace la méthode « connect » par une méthode représentant le nom de la route. Ça nous permet d’utiliser le code suivant: ‘a-propos-de-nous’) %>…. intéressant? non?
Les expressions régulières
Ce dernier truc permet d’obtenir des effets vraiment intéressants. Je reviens à mon exemple précédent. Par l’utilisation du texte prédéfini on peut rapidement identifier dans l’URL le type de document à servir, l’action et le contrôleur à utiliser. Pourtant le truc ne permet de traiter qu’un niveau de profondeur dans l’URL (i.e. je peux lier vers /ceci-est-une-page.html mais pas vers ceci/est/une/page.html). Le dernier truc permet justement de passer le contenu de l’URL tel que dans le lien attrape tout mais sans les avertissements que Rails vous générera si vous essayez de configurer map.connect ‘*alias_page.html’ , :controller => ‘document’ , :action => ‘show’. Dans un tel cas Rails passerait son temps à vous dire que le paramètre optionel ne peut être optionel à cause du texte. Donc, j’utilise la configuration suivante: map.document_link ‘:alias_page.html’ , :controller => ‘document’ , :action => ‘show’, :requirements=>{:alias_page => /.*/ } Le « /.*/ » est l’expression régulière qui indique à Rails de tout attraper et de passer outre les « / ». Donc mon alias de page peut maintenant ressembler à une url complète.
En conclusion
La configuration et personnalisation du fichier routes.rb permet de faire la différence entre une application Ruby on Rails qui ressemble aux autres et un site web qui a sa propre personnalité. Allez-y! amusez-vous à sortir des sentier battus 😉
Liens discutés dans ce blogue