homeASCIIcasts

8: Layout e content_for 

(view original Railscast)

Other translations: En Es Fr

Other formats:

Written by Andrea Salicetti

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.

The page's source with the stylesheet added

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

  1. A partire da Rails 2 il file dovrebbe chiamarsi application.html.erb