homeASCIIcasts

7: Tout savoir sur les layouts 

(view original Railscast)

Other translations: En It Es

Other formats:

Written by Adrien Giboire (adriengiboire.com)

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 :

Basic page without layout

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é.

Basic page with layout

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 %>
Basic page with controller-specific layout

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

  1. Dans Rails 2 et supérieur, le fichier devrait être appelé application.html.erb
  2. À nouveau, pour Rails 2 et supérieur, l'extension devrait être .html.erb plutôt que .rhtml.