Guillaume :
“Pourquoi diable est-ce qu’il ajoute un ‘\n’ alors qu’on n’a pas mis
de <%= ?”
C’est nous qui rajoutons les retours chariots et là , on demande à ERb
d’en sucrer un.
-
Avertissement : si vous ne vous préoccupez pas de savoir si
le HTML que vous générez est mal indenté ou contient trop de lignes
blanches, ne lisez pas ce mail. -
Terminologie
-
j’appelle ERb chunks, des trucs comme ça <% … %>,
<%= … %>, etc. Erb code chunk ceci : <% … %>,
Erb string chunk cela <%= … %>. -
J’utilise “retour chariot” comme synonyme de “newline”, au risque
de choquer les puristes.
- Avertissement n°2
Dans mes explications, je ne vais pas rentrer dans les détails de
la machinerie d’ERb, pour que ce soit plus clair, déjà que c’est
pas gagné que ce soit clair.
- Exemples de base
-
charette.rhtml:
hello
world -
charette.rhtml “version explicite”
hello (+ \n)
world
Il y a deux lignes, car on a mis un retour chariot entre ‘hello’ et
‘world’.
(dans toute la suite, je suppose que je ne mets pas de newlines tout Ã
la fin de mon fichier, ni même de ‘whitespaces’, ça finit toujours
par world)
- Avec des chunks Erb
- charette.rhtml avec un ERb code chunk :
hello
<% true %>
world
Sous forme de chaîne de caractères, ce fichier sera vu :
“hello\n<% true %>\nworld”
2 retours chariot => 3 lignes.
Comme mon ERb ne fait rien, le fichier html généré sous forme
de string, sera sous la forme “hello\n\nworld”. Dans mon navigateur,
j’aurai “hello world”.
Remarque n°1, on génère du HTML, donc une suite d’espaces,
de retours chariot ou tabulations ne sera représentée à l’écran
que par une espace.
Si on générait d’autres formats de fichier (exemple texte), alors
les retours chariot pourraient être significatifs.
- charette.rhtml avec un ERb string chunk :
hello
<% “my” %>
world
3 lignes, le html => “hello\nmy\nworld”, 2 newlines donc 3 lignes,
à l’écran “hello my world”.
- charette.rhtml avec un ERb code chunk sur plusieurs lignes:
hello
<%
true
%>
world
Le “\ntrue\n” sera géré par ERb (et donc par Rails), donc
“hello\n<%\ntrue\n%>\nworld” genère en html “hello\n\nworld”,
2 retours chariots, soit 3 lignes.
mais à l’écran, toujours “hello world”, HTML oblige.
Pour un ERb string chunk, ce qui compte, c’est de savoir si l’objet
obtenu à la fin, une fois converti en String, contient des newlines.
(si on a déjà une chaîne, la conversion ne fait évidemment rien)
<%= “hello\n” %> -> génère un retour chariot
Mais (Erb string chunk sur plusieurs lignes)
<%= if choix == true
“hello”
else
“goodbye”
end %>
… génère “hello” ou “goodbye”, selon la condition, chaînes qui
n’ont pas de \n.
- L’ERb code chunk avec un moins à la fin : <% -%>
Rails, par défaut, utilise ERb dans un mode qui prend en considération
la présence du moins.
Quand on spécifie -%>, on dit à ERb : “si tu es en fin de ligne, ie.
ce chunk est suivi par un retour chariot, sucre-le”.
- charette.rhtml:
hello
<% true -%>
world
=> “hello\n<% true -%>\nworld” => “hello\nworld” (2 lignes)
=> “hello world” à l’écran.
- charette.rhtml:
hello
brave <% true -%>
world
html : “hello\nbrave world”
browser : “hello brave world”
- charette.rhtml:
hello
<% true -%>brave
world
html : “hello\nbrave\nworld”
butineur : “hello brave world”
- charette.rhtml:
hello
brave <% true -%>new
world
(ici dans les deux derniers exemples, l’Erb chunk code n’est pas suivi
par \n, donc le - ne sert à rien)
html : “hello\nbrave new\nworld”
navigateur : “hello brave new world”
Après, je peux faire des variations en mettant plusieurs Erb chunks
sur une même ligne, mais je ne vais pas faire toutes les combinaisons
possibles et imaginables non plus !
- L’ERb code chunk avec un moins au début : <%- %>
C’est moins connu, on peut virer les espaces ou tabulations en début
de ligne (s’il n’y a que ça) avec <%-
- charette.rhtml:
hello
<%- true %>world
=> “hello\nworld”
- charette.rhtml:
hello
<%- true %>
world
=> “hello\n\nworld”
(déjà en début de ligne !, donc - ne sert à rien)
- charette.rhtml:
hello
brave <%- true%>world
=> “hello\n brave world”
(ici, le - ne sert à rien)
- Remarque n°2 : on peut utiliser des Erb code chunks
avec des doubles moins.
| .... | <%- end -%>
- Remarque n°3 : <%= … -%> est possible, mais pas forcément
ce qu’on recherche.
EN RÉSUMÉ
-%> essaie de virer le newline juste après.
<%- essaie de virer les espaces/tabulations juste avant.
<% ne se préoccupe pas de ce qui précède.
%> ne se préoccupe pas de ce qui suit.
Pouet.
-- Jean-François.
Je te rassure, j’ai trouvé