Un altro utile meccanismo per tenere in ordine il codice delle viste è rappresentato dai partial. Con i partial è possibile estrarre una porzione di codice da una vista e salvarla in un file esterno; il codice estratto nel partial può essere condiviso da differenti viste e può essere tanto codice HTML statico quanto codice dinamico erb.
Apriamo il file app/views/bookmarks/index.html.erb
; da questo file tagliamo il codice per la visualizzazione dei singoli bookmark e incolliamolo in un nuovo file dal nome app/views/bookmarks/_single_bookmark.html.erb
; il file _single_bookmark.html.erb
è un partial (i partial si riconoscono per l'underscire come suffisso del nome del file che li contengono) e contiene solo il seguente codice:
<li> <strong><%= link_to bookmark.title, bookmark.url %></strong><br /> <%= bookmark.description %><br /> Tag: <% for tag in bookmark.tag_list %> <%= link_to tag, :controller => "tags", :action => "show", :id => tag %> <% end %><br /> <small> <%= link_to 'Show', bookmark %> | <%= link_to 'Edit', edit_bookmark_path(bookmark) %> | <%= link_to 'Destroy', bookmark, :confirm => 'Are you sure?', :method => :delete %> </small> </li>
Nella vista index.html.erb
sostituiamo il codice che è stato estratto con l'istruzione per l'inclusione del partial:
<h1>Listing bookmarks</h1> <ul> <% for bookmark in @bookmarks %> <%= render :partial => "single_bookmark", :locals => { :bookmark => bookmark } %> <% end %> </ul> <br /> <%= link_to 'New bookmark', new_bookmark_path %>
L'istruzione render
inserita nel ciclo for
richiede l'inclusione del partial di nome single_bookmark
assegnando alla variabile locale bookmark il valore dell'iteratore del ciclo for
.
Abbiamo detto che uno stesso partial può essere utilizzato da viste differenti; modifichiamo allora la vista app/views/tags/show.html.erb
per includere il partial così come fatto per la vista appena modificata. Poiché il parziale non risiede nella stessa cartelle della vista, app/views/tags
ma nella cartella app/views/bookmarks
sarà necessario indicare il percorso completo del partial:
<h1>Listing bookmarks with tag "<%= @tag %>"</h1> <ul> <% for bookmark in @bookmarks %> <%= render :partial => "bookmarks/single_bookmark", :locals => { :bookmark => bookmark } %> <% end %> </ul> <br /> <%= link_to 'New bookmark', new_bookmark_path %>
Accedendo con il browser alle pagine di elenco dei bookmark e visualizzazione dei bookmark per un determinato tag, osserviamo come il partial viene utilizzato per la generazione delle differenti viste.
L'utilizzo dei partial è fortemente consigliato quando si verifica una delle seguenti situazioni:
- il codice di una vista è corposo, ed è difficile individuare le differenti parti della pagina; estraendo porzioni di codice in partial esterni il codice della vista risulterà più chiaro
- differenti viste, anche di controller differenti, hanno porzioni di codice in comune; estraendo queste parti di codice in un partial esterno da includere nelle differenti viste si concentra in un solo posto codice che di fatto è ripetuto in differenti parti dell'applicazione
È bene ricordare che è necessario rendere disponibile al partial tutte le variabili di cui ha bisogno per la sua corretta renderizzazione; un partial non condivide automaticamente le variabili con la vista che lo utilizza. Per rendere disponibili le variabili è necessario utilizzare il parametro :locals =>
come nell'esempio precedente.