Ici et ailleurs

Le blog d’un joueur … mais pas que le blog de Sky.

Ruby on Rails : Les partials

Nous allons donc reprendre en douceur ce que nous avions commencé en parlant d’un sujet qui rejoint les layouts, les partials. Ce tuto va donc rester dans la partie visuelle de notre projet.

Layouts ? Partials ? Késako ?

Nous avions donc parlé des layouts et du rendering avec RoR. On avait vu que les layouts permettaient d’éviter d’écrire du code redondant et de mieux organiser ses vues. Et les partials dans tout ça ? Et bien les partials rejoignent le même objectif !

Reste que l’utilité peut paraître difficile à comprendre, les layouts étant déjà très puissants. On verra cependant que les partials sont particulièrement adaptés pour le rendu d’une collection. Bref, pratiquons un peu !

Concrètement

Les bases

Un partial, comme un layout est donc un fichier qui se situe dans le même répertoire que nos vues et donc dans mon cas /app/views/notes/, mais qui est préfixé par un underscore _. Créons donc un fichier /app/views/notes/_footer.html.erb et déplaçons le div footer du fichier /app/views/layouts/notes.html.erb dans notre partial.

/app/views/notes/_footer.html.erb

<div id="footer">
<p><small>Rails Notes est propuls&eacute; par Ruby on Rails!</small></p>
</div>

Notre footer étant un élément statique, nous n’aurons pas besoin d’utiliser un yield à l’intérieur ce qui en fait un très bon prétendant.

Notre partial est donc créé, il serait peut-être temps de l’appeler. Pour ce faire direction notre layout:

/app/views/layouts/notes.html.erb

<!DOCTYPE html>
<html>
<head>
<%= yield :title %>
<%= stylesheet_link_tag "style", "http://fonts.googleapis.com/css?family=Kristi" %>
</head>
<body>
<div class="wrapper">
<div id="header">
<h3><%= link_to "Rails Notes", "/" %></h3>
</div>

<div id="content">
<%= yield %>
</div>

<!-- Appel de notre partial -->
<%= render "footer" %>
</div>
</body>
</html>

L’appel d’un partial est donc effectué avec ce bon vieux render utilisé directement au sein de la vue et avec le nom du fichier sans l’underscore. Si on souhaite afficher un partial se situant dans un autre dossier, comme /app/views/banners/, il suffit juste de le préciser :

render "banners/ad"

Des tas de possibilités

Comme avec le render qu’on avait vu précédemment, celui-ci possède tout un tas de paramètres dont les principaux sont les suivants:

:layout

Permet d’afficher un partial en utilisant un layout.

render "banners/ad", :layout => "special"

:locals

Permet de passer des variables aux partials, très utile lorsque vous souhaitez les rendre dynamiques. Ça s’utilise le plus simplement du monde et prend un hash en paramètre.

render :partial => "footer", :locals => { :var => @votre_var }

Dans notre partial, on pourra donc utiliser la variable var.

:object

On rejoint un peu ce qui a été dit au dessus. Lors de l’appel pour afficher un partial, Rails met automatiquement à disposition une variable dans notre partial qui possède le même nom mais sans l’underscore. Par exemple, en appelant le partial “ad”, on pourra dans ce même partial utiliser la variable ad.

render :partial => "ad", :object => @var

Le paramètre :object permet donc de déterminer avec quoi initialiser la variable.

Il existe encore d’autres paramètres mais il y’en à un qui m’intéresse tout particulièrement.

Afficher une collection grâce aux partials

Je me trompe peut-être, mais c’est la fonction que je trouve la plus utile aux partials. Plutôt que de faire un each sur notre collection, on va envoyer notre collection à un partial et il sera appelé pour chaque élément de notre collection. Modifions notre code cette fois-ci.

/app/views/notes/index.html.erb

<% content_for :title do %>
<title>Rails Note : Liste des notes</title>
<% end %>

<h1 class="float-left">Liste des notes</h1>
<a id="add-note" href="<%= new_note_url %>">+ cr&eacute;er une note</a>

<ul id="notes">
<%= render @notes %> <!-- Seule cette partie change -->
</ul>

Créer un partial /app/views/notes/_note.html.erb

<!-- On a donc accès à des variables nommées d'après le modèle de la collection -->
<li><em><%= note.created_at.strftime("%m.%d.%Y") %></em> - <%= link_to(note.description, note_path(note.id)) %></li>

Et voilà ! Alors en réalité, il y’a quelques règles à respecter pour que cette syntaxe très courte puisse fonctionner :

  • La variable envoyée doit être une collection,
  • Un partial nommé d’après le singulier de la collection, donc le nom du modèle, doit exister.

Évidemment, on peut aussi utiliser la syntaxe un peu plus lourde mais plus souple suivante :

render :partial => "note", :collection => @notes

En utilisant la syntaxe courte, Rails détermine quel partial utilisé et c’est assez sympathique. De cette manière, on peut avoir une collection d’objet hétérogène, demander au partial d’afficher la collection et le partial sera choisit en fonction du type de l’élément lors de l’affichage !

Tags: ,

2 commentaires pour “Ruby on Rails : Les partials”

  1. Sylario dit :

    C’est :partial et non pas :partials pour le tout dernier exemple. Pour les autres je ne sais pas si c’est au pluriel ou au singulier.

  2. Sky dit :

    Exact, merci de l’avoir souligné.

Laisser un commentaire

Si vous avez un compte sur WeFrag, connectez-vous pour publier un commentaire.

Vous pouvez, entre autres, utiliser les tags XHTML suivant :
<a href="" title="">...</a>,<b>...</b>,<blockquote cite="">...</blockquote>,<code>...</code>,<i>...</i>