#8 Layouts and content_for
Qui sotto abbiamo un file di layout di applicazione e una action index
:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <title>Todo List</title> <%= stylesheet_link_tag 'application' %> </head> <body> <div id="container"> <h1>Todo List</h1> <%= yield %> </div> </body> </html>
application.rhtml[1]
<h2>Projects</h2> <ul> <% for project in @projects %> <li><%= project.name %></li> <% end %> </ul>
index.rhtml [1]
Quando l’ azione index
è renderizzata, lo sarà all’interno del file di layout. (vedi il precedente episodio per maggiori dettagli sui layout). E se volessimo più controllo sui layout e volessimo personalizzarli in base al template specifico che si sta renderizzando? Diciamo, per esempio, che vogliamo usare un file CSS personalizzato nel template index
. La soluzione è di usare un metodo helper chiamato content_for
nel nostro template. content_for
prende un simbolo come identificatore, in questo caso :head
, e un blocco. Il codice all’interno del blocco sarà salvato per un utilizzo successivo e non verrà stampato sul template.
<% content_for :head do %> <%= stylesheet_link_tag 'projects' %> <% end %> <h2>Projects</h2> <ul> <% for project in @projects %> <li><%= project.name %></li> <% end %> </ul>
index.rhtml[1]
Questa modifica non ha alcun effetto da sola poichè non stiamo stampando da nessuna parte il contenuto della content_for
. Il prossimo passo è proprio quello di stampare tale contenuto da qualche parte nel layout. Ciò può essere fatto richiamando yield
con il simbolo che abbiamo fornito alla content_for
. Così, aggiungendo yield :head
con un blocco ERB alla sezione di intestazione del nostro layout, il codice contenuto nel blocco content_for :head
del nostro template sarà renderizzato proprio là.
... <head> <title>Todo List</title> <%= stylesheet_link_tag 'project' %> <%= yield :head %> </head> ...
Dando un’occhiata al sorgente della pagina, possiamo ora notare il riferimento allo stylesheet così come definito nel contenuto del nostro blocco.
content_for
fornisce un meccanismo davvero utile per cambiare il contenuto di un layout in modo dipendente dalla singola action. Così come per l’aggiunta di stylesheets, vista in questo esempio, è altresì possibile utilizzare questo meccanismo per mostrare menu, barre laterali o qualunque altro tipo di contenuto volessimo, in modo dipendente dalla specifica action.
Note
- A partire da Rails 2 il file dovrebbe chiamarsi
application.html.erb