Le plugin nested_layouts permet d’outrepasser une limitation de Rails qui empêche d’utiliser des gabarits de pages imbriqués. Le but est de permettre d’utiliser un gabarit général pour l’ensemble de votre site, ainsi que plusieurs sous-gabarits pour d’éventuels sous-menus propres aux différentes parties de vos applications.
Fonctionnement des gabarits dans Rails
Pour rappel, Rails fournit un système astucieux de gabarits de pages (templates). Si vous nommez une vue “application.html.erb” dans le dossier “app/views/layouts”, celle-ci sera utilisée comme gabarit de page pour l’ensemble des vues présentes dans votre site. Pour spécifier dans ce gabarit l’endroit où la vue particulière doit intervenir, vous faites usage du mot-clef yield. Dans l’exemple qui suit, la phrase “Bonjour!” propre à l’action index du contrôleur “MonControleur” suivra le titre “Bievenue sur mon site” présent dans le gabarit général de l’application:
# app/views/layouts/application.html.erb
<html>
<body>
<h1>Bienvenue sur mon site</h1>
<%= yield %>
</body>
</html>
# app/views/mon_controleur/index.html.erb
Bonjour!
De plus, si vous souhaitez utiliser un gabarit différent d’un contrôleur à l’autre, il est possible de créer une vue du nom de contrôleur dans ce même dossier “app/views/layouts” et toutes les actions de ce contrôleur utiliseront par défaut ce gabarit. Cela permet d’avoir un gabarit particulier pour chaque partie de votre application, ce qui s’avère souvent utile pour afficher des sous-menus (comme un menu “catégories” dans un contrôleur “produits”), par exemple.
Le problème est que, dans ce cas, Rails utilise ce gabarit au lieu du gabarit général (qui est alors simplement ignoré), ce qui peut-être embêtant étant donné que la plupart du temps, l’ensemble de votre application garde malgré tout un design commun (logo, menu général, footer, etc.).
On voudrait donc pouvoir garder ce gabarit commun, tout en permettant l’usage d’un sous-gabarit propre. C’est là qu’intervient le plugin Nested Layouts.
Le plugin Nested Layouts
Ce plugin est très simple (il ne fait pas 30 lignes de code). Commencez tout d’abord par l’installer (et n’oubliez pas de redémarrer votre serveur ensuite, pour le charger):
script/plugin install svn://rubyforge.org/var/svn/nested-layouts/trunk/nested_layouts
Vous pouvez maintenant spécifier des sous-gabarits. Votre application.html.erb reste identique à auparavant:
# app/views/layouts/application.html.erb
<html>
<body>
<h1>Bienvenue sur mon site</h1>
<%= yield %>
</body>
</html>
De même que vos vues propre à chaque action:
# app/views/mon_controleur/index.html.erb
Bonjour!
La différence est que maintenant, vous pouvez appeler le gabarit général à partir d’un sous-gabarit, dans notre exemple celui propre au contrôleur “mon_controleur” :
# app/views/layouts/mon_controleur.html.erb
<% inside_layout 'application' do -%>
<h2>Mon sous-menu</h2>
<ul>
<li>Element 1</li>
<li>Element 2</li>
</ul>
<%= yield %>
<% end -%>
Votre action index affichera dès lors “Bonjour!” dans le sous-gabarit de “mon_controleur”, lui même inclus dans le gabarit général, ce qui donnera ceci en sortie:
<html>
<body>
<h1>Bienvenue sur mon site</h1>
<h2>Mon sous-menu</h2>
<ul>
<li>Element 1</li>
<li>Element 2</li>
</ul>
Bonjour!
</body>
</html>
En bonus, il est même possible de passer des données du sous-gabarit vers le gabarit général, et ce au moyen de la variable @other_data_for_outer_layout:
# app/views/layouts/mon_controleur.html.erb
<% inside_layout 'application' do -%>
<% @other_data_for_outer_layout = 'coucou' -%>
<%= yield %>
<% end -%>
# app/views/layouts/application.html.erb
<html>
<body>
<h1>Bienvenue sur mon site</h1>
<p>Message du contrôleur : <%= @other_data_for_outer_layout %></p>
<%= yield %>
</body>
</html>
0 Commentaires