Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Introduzione a controller e viste

Il funzionamento di controller e viste secondo Rails
Il funzionamento di controller e viste secondo Rails
Link copiato negli appunti

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 cartella app/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 controller BookmarksController c'è la cartella app/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 controller BookmarksController 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.

Ti consigliamo anche