Il controller, nell'architettura MVC, riveste la funzione di coordinatore delle differenti componenti dell'applicazione: da una parte dialoga con i modelli per estrarre e manipolare i dati conservati nel database, dall'altra dialoga con le viste per interagire con l'utente.
In Rails i controller risiedono nella cartella app/controllers
, all'interno di file dal nome <nome_significativo>_controller.rb
ed estendono la classe ApplicationController
; all'interno di ogni controller sono presenti diverse action, definite come metodi della classe controller
.
Apriamo il file app/controllers/bookmarks_controller.rb
per analizzare nel dettaglio il controller per la gestione dei bookmark, ed in particolare soffermiamoci sulla action show
:
class BookmarksController < ApplicationController ... # GET /bookmarks/1 # GET /bookmarks/1.xml def show @bookmark = Bookmark.find(params[:id]) respond_to do |format| format.html # show.html.erb format.xml { render :xml => @bookmark } end end ... end
Il nome della classe che definisce il controller rispecchia il nome del file in cui la classe è contenuta (BookmarksController
per il file bookmarks_controller.rb
) e le action sono definite come metodi della classe in minuscolo.
Fin dalla prima istruzione si può osservare il controller dialogare con i modelli, in questo caso per l'estrazione di un particolare bookmark. Il metodo find
, già descritto nelle precedenti lezioni, estrae il bookmark avente come id
il valore di params[:id]
.
Il bookmark estratto dal metodo find
viene conservato nella variabile @bookmark
; quando una variabile ha il nome preceduto dal simbolo @
, come in questo caso, la variabile e il suo valore sono disponibili non solo all'interno del controller ma anche alle viste richiamate durante l'esecuzione del controller.
Per mezzo di queste variabili il controller può rendere disponibili i dati estratti dal modello alla vista, come nel nostro esempio sta capitando per il bookmark estratto con il metodo find
e conservato nella variabile @bookmark
.
Dopo aver eseguito la logica della action, in questo caso l'estrazione dal database, si deve rendere disponibile il risultato della action all'utente per mezzo delle viste.
Il controller prevede che il risultato possa essere proposto sia come pagina HTML, sia come file XML; per decidere quale formato scegliere il controller verifica l'estensione con la quale è stata formulata la richiesta e decide di conseguenza quale risposta dare.
Il blocco di codice
respond_to do |format|
format.html # show.html.erb
format.xml { render :xml => @bookmark }
end
indica che, se la richiesta è pervenuta con estensione .html
viene generata vista legata alla action (la pagina HTML), se l'estensione è .xml
viene generato un documento XML che rappresenta i dati contenuti in @bookmark
.
Se l'estensione è omessa, Rails si comporterà come se l'estensione fosse .html
. Per toccare con mano questa funzionalità avviamo il server da terminale e osserviamo cosa succede per le diverse richieste.
Indirizzo | Estensione | Risposta |
---|---|---|
http://0.0.0.0:3000/bookmarks/1.html |
.html |
pagina Web (HTML) |
http://0.0.0.0:3000/bookmarks/1.xml |
.xml |
documento XML |
http://0.0.0.0:3000/bookmarks/1 |
assente |
pagina Web (HTML) |
Nel codice della action show
non è indicato esplicitamente quale vista utilizzare per la generazione della pagina HTML; il collegamento fra controller e viste avviene per mezzo di convenzioni:
- per ogni controller nella cartella
app/controllers
c'è presente una cartella corrispondente nella cartellaapp/views
che contiene le viste relative a quel controller - il nome della cartella dedicata alle viste ha lo stesso nome del controller
(es. per il controllerBookmarksController
c'è la cartellaapp/views/bookmarks
- la cartella in
app/views
contiene un file per ogni action del controller - i nomi dei file delle viste associate alle action rispettano il formato
<nome_action>.<formato>.<sistema di template utilizzato>
(es. il file che genera la pagina HTML per la action
index
del controllerBookmarksController
saràapp/views/bookmarks/index.html.erb
)
Seguendo queste convenzioni il risultato della action può essere presentato all'utente tramite una pagina HTML; i dati preparati dal controller sono resi disponibili alla vista per mezzo di variabili condivise.
Il compito della vista però non si esaurisce nella presentazione di un risultato all'utente; la vista ha anche il compito di raccogliere dati dall'utente e di comunicarli alla action, così come capita ad esempio quando si crea un nuovo bookmark. Nella prossima lezione analizzeremo questa situazione ponendo particolare attenzione a come i parametri vengono passati dalla vista al controller.