Se avete un minimo di spirito d'attenzione, avrete notato che la directory views
non contiene solo una sottodirectory chiamata home
ma anche una chiamata layouts
. I layout sono una caratteristica abbastanza peculiare di Rails, e sono pensati per raccogliere codice condiviso tra le diverse pagine di un controller o di un'intera applicazione.
La situazioni in cui si usano i layout sono quelle in cui si vuole avere una sorta di cornice nella quale inserire il corpo delle pagine. Ad esempio, potreste volere che all'inizio di tutte le pagine sia presente un header, poi un menu che permetta di navigare nel sito, ed alla fine di tutte le pagine delle note sul copyright. L'approccio classico che si userebbe con altri ambienti di sviluppo sarebbe di creare un file per contenere l'header, poi uno per il menu ed infine uno per il footer, e poi di includerli in ogni singola pagina che dovesse usarli.
Rails invece usa un solo file, il layout, che contiene sia l'header sia il menu sia il footer, più uno specie di segnaposto in cui verrà infilato il contenuto della pagina. Per capire meglio, creeremo un file app/views/layouts/application.rhtml
fatto in questo modo:
<html>
<head>
<title> HForum </title>
</head>
<body>
<%= @content_for_layout %>
<div>
<small>Powered by Ruby On Rails</small>
</div>
</body>
</html>
come vedete è un file .rhtml come gli altri, solo che fa riferimento ad una variabile @content_for_layout
. Questo è il segnaposto di cui parlavamo prima, ma ormai conosciamo il funzionamento dei file rhtml e quindi possiamo capire cosa sia in realtà: si tratta di una normale variabile, che non fa altro che contenere il risultato del processing delle singole pagine.
Poiché la gestione è invertita rispetto al solito (è il layout che si occupa delle pagine, non le pagine che gestiscono header e footer) è possibile velocizzare molto lo sviluppo, in quanto non dobbiamo preoccuparci di scrivere in ogni pagina quali file deve caricare, con tutti i problemi di manutenibilità e codice ridondante che questo comporta, ma ci basta, come al solito, seguire le convenzioni di Rails.
Come fa Rails ad associare un layout ad un'azione? Il meccanismo è banale, se dentro la directory app/views/layouts, create un layout chiamato mio_controller.rhtml
, esso verrà usato automaticamente per tutte le azioni definite in MioController
. Se invece, come abbiamo appena fatto, definite un layout application.rhtml
esso verrà usato come default per l'intera applicazione. Sarà poi ovviamente possibile disabilitare il layout per una singola azione, come vedremo più avanti, per far si che non compaia, ad esempio, uno spezzone di html in un'azione che gestisce i feed.
Un layout è una vista come le altre, e questo significa che potete accedere a tutte le variabili d'istanza definite normalmente dalle azioni. Questo è molto utile per lasciare degli elementi fissati ma con contenuto differente, come ad esempio un tag <title>
che abbia un valore dipendente dalla pagina. Nel nostro caso basterebbe cambiare l'inizio del layout in questo modo:
<head>
<title> <%= @title %> </title>
</head>
ed aver cura di impostare la variabile @title
in ogni azione.