On The Rails Again

Comprendre les routes en Rails

Posté par Nicolas le 20 octobre 2011

Ce que nous allons voir :
  • Le fonctionnement du routeur Rails.
  • Les utilisations de bases.

Comprendre le fonctionnement

Voici une schéma explicatif permettant de comprendre le rôle du routeur dans le fonctionnement d'une application Rails.

Représentation schématique du fonctionnement des routes

Le processus commence avec une requête faite à partir du navigateur. Cette requête est ensuite transmise au routeur Rails qui l'analyse et extrait les informations suivantes :

  • le contrôleur à instancier ;
  • l'action (correspondant à une méthode) à appeler dans ce contrôleur ;
  • enfin, si il y en a, les paramètres à passer à cette méthode.

Lorsqu'il reçoit une URL correctement formattée, le routeur Rails instancie le contrôleur spécifié et appelle la méthode appropriée en lui passant les paramètres si besoin. Le contrôleur va donc effectuer les actions nécessaires et Rails renverra la vue correspondante. Cette vue sera ensuite renvoyée au navigateur. Cette explication est volontairement simplifiée mais elle montre l'importance du routeur Rails.

Par contre si le routeur Rails reçoit une URL mal formattée, il sera incapable d'effectuer les bonnes actions. Il est donc très important que le format de l'URL soit correct, c'est pourquoi le routeur Rails à également une deuxième fonction : nous aider à générer de bonnes URLs.

Donc pour synthétiser, le routeur Rails à deux fonctions principales :

  • connecter des URLs au code, c'est à dire les interpreter, instancier le bon contrôleur et enfin appeler les bonnes actions ;
  • générer des chemins et des URLs sans avoir besoin de les écrire «à la main» dans le code.

Le routeur Rails effectue ces deux fonctions en utilisant les règles de routage définies dans le fichier config/routes.rb. Voyons chacune de ces fonctions un peu plus en détail.

Connecter les URLs au code

Prenons un exemple, supposons que j'ai écris une fonction new dans le contrôleur articles_controller. J'aimerais que cette méthode soit éxecutée lorsque j'accède à l'URL suivante : www.monsite.fr/articles/new.

Pour cela, il suffit simplement de définir la règle suivante dans le fichier config/routes.rb :

# config/routes.rb
match "articles/new" => "articles#new"

Décorticons un peu cette règle. Tout d'abord on définit l'URL que notre routeur doit reconnaître avec la première partie de la règle : match "articles/new".

On note qu'il n'y a pas besoin de préciser le nom de domaine, ceci est dû au fait que notre routeur ce trouve dans notre application et que notre application est accessible via son nom de domaine.

Ensuite on précise quelle partie de code doit être éxécutée lorsque l'on pointe vers cette URL, avec la seconde partie de la règle => "articles#new". Ce qui se trouve à gauche du # correspond au contrôleur à instancier et ce qui se trouve à droite correspond à la méthode à appeler.

Rails nous permet également de définir la même règle plus simplement :

# config/routes.rb
get "articles/new"

Voilà un exemple de la première utilité du routeur Rails qui est de relier les URLs au code, passons maintenant à la seconde utilité de ce routeur.

Générer des chemins et des URLs

Un peu de théorie

Le routeur permet également de générer des routes helpers qui sont des méthodes qui renvoies une URL correctement formattée. En effet, si vous avez écrit la règle précedente dans votre fichier config/routes.rb et que vous tapez la commande suivante dans un terminal à la racine de votre application :

$ rake routes

vous obtiendrez ceci :

new_article GET /articles/new(.:format) {:controller => "articles", :action => "new"}

A partir de cette ligne on peut extraire les informations suivantes :

  • Le prefixe du helper, qui est ici new_article
  • La méthode HTTP utilisé, ici c'est GET.
  • Le format de l'URL, ici c'est /articles/new(.:format).
  • Le contrôleur qui sera appelé si on accède à cette URL
  • Et enfin, l'action du contrôleur qui sera appelée.

A partir du préfixe, on obtient le nom des deux helpers générés à savoir new_article_path et new_article_url. La différence entre les deux est tout simplement que la version URL contient le nom de domaine et le port en plus du chemin. Par exemple :

  • new_article_path redirige vers /articles/new(.:format)
  • alors que new_article_url redirige vers http://www.monsite.fr/articles/new(.:format)

Dans l'exemple précédent, le numéro du port n'est pas indiqué car c'est le port HTTP par défaut à savoir le port 80.

Utilisation de ces helpers

Les helpers générés par le routeur Rails peuvent s'utiliser dans la vue et rendent le code plus facile à lire et plus fiable puisque qu'on est sûr que l'URL sera bien formatée. Par exemple pour faire un lien interne qui redirige vers www.monsite.fr/articles/new on peut tout simplement faire comme ça :

<%= link_to "Créer un nouvel article", new_article_path %>

Voilà pour ce qui est des bases des routes en Rails. Je publierai d'autres articles pour détailler les différentes manières de définir les règles dans le fichier routes.rb. Si vous avez des questions ou des améliorations à proposer n'hésitez pas à laisser un commentaire.

Références