J’avais remarqué que le <%= @content_for_layout %> avait été remplacé
par <%= yield %> mais je n’avais pas fait attention.
Ce changement a été introduit dans la version 1.1.5 par Marcel Molina
Jr.
(Peak Obsession).
Dans un article de Kevin C. sur Gluttonous
(http://glu.ttono.us/articles/2006/03/21/rails-for-designers),
quelqu’un pose la question dans les commentaires, et l’auteur répond :
“yield is prefered because it allows the core developers to change
what happens in the backend more easily than an accessible instance
variable (which is what @content_for_layout is). They’re looking for
long term maintainability, and yield is better to that end. yield is
also more Ruby-like.”
Mais qu’est-ce que “yield” ?
En Ruby, yield permet d’exécuter le code du bloc qui a été passé à la
méthode courante. Par exemple :
def threeTimes
yield
yield
yield
end
threeTimes { puts “Hello” }
affiche :
Hello
Hello
Hello
(exemple honteusement recopié depuis Ruby Central
(http://www.rubycentral.com/book/tut_containers.html))
Si on veut lui passer des arguments :
def threeTimes
yield “Bruno”
yield “Nicolas”
yield “Guillaume”
end
threeTimes { |cool_guy| puts "Hello " + cool_guy }
affiche :
Hello Bruno
Hello Nicolas
Hello Guillaume
On retrouve la forme connue des my_array.each { |element| code }.
En fouillant dans la liste de Rails, je suis tombé sur un message
intéressant expliquant que la forme yield :symbol remplaçait celle de
content_for :symbol
(http://lists.rubyonrails.org/pipermail/rails/2006-June/044707.html).
Et enfin, dans le code d’ActionView, on peut lire que pour chacune des
variables @content_for, le code qu’elles contiennent est exécutée
(http://dev.rubyonrails.org/browser/trunk/actionpack/lib/action_view/base.rb?rev=3314#L292).
Bref, un layout dans le layout comme on peut le lire à droite ou Ã
gauche.
Merci encore à Guillaume GARCERA d’avoir montré ça, car moi non plus
je ne connaissais pas, et ça permettra de rendre mon layout principal
encore plus dynamique, par exemple avec un <% content_for :meta do %>
… <% end %> ou autres, pour des parties de la page qui ne sont pas
le contenu principal.
PS : je me rends compte que je vous ai raconté mes recherches, et que
peut-êytre ça passionnera pas grand monde, alors, pour qu’il y ait un
contenu correct, que tout le monde s’accorde à qualifier de valable,
je n’ajouterai qu’une chose : “Chunky Bacon !”