#7 All About Layouts
Cet épisode est entièrement consacré aux layouts. Les layouts sont des fichiers de vue qui définissent le code qui englobe un gabarit (template). Ils peuvent être partagé dans beaucoup d'actions et de contrôleurs.
Les layouts applicatif
Le gabarit ci-dessous liste tout les projets.
<h2>Projects</h2> <ul> <% for project in @projects %> <li><%= project.name %></li> <% end %> </ul>
Il génère une page web assez basique :
Si nous voulons ajouter, disons, une entête, un logo et un menu de navigation à ce site et les avoir sur chaque page alors nous devrions utiliser un layout. Les layouts sont stockés dans le répertoire /app/view/layouts
de l'application Rails. Pour en créer un, créez un nouveau fichier nommé application.rhtml
[1] dans le dossier des layouts. Ceci créera un layout global qui sera utilisé par tous les contrôleurs et toutes les actions. Le layout de notre application ressemble à ça :
<h1>Application Layout!</h1> <%= yield %>
La ligne importante dans le code ci-dessus est la seconde. Le mot clé yield
dit au layout où placer le contenu pour les templates qui utilisent le layout. Maintenant, si nous regardons à nouveau la page d'avant, nous pouvons voir que le layout a été ajouté.
Le layout est global, donc il sera ajouté à n'importe quelle action de n'importe quel contrôleur de l'application. La plupart du temps ceci suffira mais que faire si nous avons besoin de layouts différents pour différentes parties de notre application ?
Les layouts spécifiques à un contrôleur
Un layout peut être rendu spécifique à un contrôleur en donnant au layout le nom du contrôleur. Ainsi pour faire qu'un layout qui sera utilisé par toutes les actions dans le contrôleur Projects
, créez un fichier dans le répertoire layouts
que vous nommerez projects.rhtml
[2]. Ça signifie que le layout sera utilisé uniquement par le contrôleur Projects
.
<h1>Project Layout!</h1> <%= yield %>
Comment faire pour partager un layout avec plusieurs contrôleur, pas uniquement pour un seul, e.g. un layout pour l'administration ? Rails vous permet d'utiliser la commande layout
pour spécifier le nom du layout qui devrait être utilisé au sein d'un contrôleur..
class ProjectsController < ApplicationController layout "admin" def index @projects = Project.find(:all) end end
Un layout spécifié avec la commande layout
surchargera n'importe quels layouts spécifiques à un contrôleur ou à une application.
Les layouts dynamiques
Les layouts peuvent aussi être utilisés dynamiquement. Nous pourrions seulement vouloir que le layout admin
soit utiliser quand un utilisateur est connecté. Ça peut être fait en transmettant un symbole comme argument à la commande layout
et en créant une méthode avec le même nom que le symbole qui détermine quel layout devrait être utilisé.
class ProjectsController < ApplicationController layout :user_layout def index @projects = Project.find(:all) end protected def user_layout if current_user.admin? "admin" else "application" end end end
Nous pouvons restreindre un layout à une seule action dans un contrôleur avec la commande render
.
def index @projects = Project.find(:all) render :layout => "projects" end
Le layout spécifié avec la commande render
surchargera n'importe quel layout spécifique à un contrôleur. Pour rendre une action sans aucun layout, on peut utiliser :
render :layout => false
Notes
- Dans Rails 2 et supérieur, le fichier devrait être appelé
application.html.erb
- À nouveau, pour Rails 2 et supérieur, l'extension devrait être
.html.erb
plutôt que.rhtml
.