5.1 - Capire il routing
Vedi tutte le pagine e le modifiche recenti o scarica i sorgenti nella pagina
Come tutte le web application di questo mondo, una volta avviato il server, esso si mette in ascolto su una determinata porta, aspettando eventuali richieste. Una volta ricevuta una richiesta il framework Rails istanzierà un determinato controller (una sottoclasse di ActionController::Base) e invocherà un determinato metodo chiamato per l’occasione action (azione per gli xenofobi). Questo metodo sarà incaricato di eseguire funzionalità specifiche prima di mostrare una determinata porzione di codice html (la vista/view) all’utente che ha inoltrato la richiesta.
Riporto per comodità il comodo schemino presentato qualche capitolo fa:
Ora la domanda sorge spontanea: come fa a capire Rails quale controller istanziare e quale azione invocare??
Rails percepisce queste informazioni tramite un processo chiamato routing (instradamento) che permette di “formattare” in modo particolare l’url che compone la richiesta. Guardiamo subito un esempio:
Una richiesta a questo indirizzo:http://dominio/team/listverrà “tradotto” dal routing in qualcosa di simile: istanzia il controller Team e invoca la sua azione list.
Niente di più semplice no?
Ovviamente esistono situazioni in cui una così alta semplicità non basta: proviamo a pensare alla pagina che mostra il dettaglio di una squadra. Non sarà sufficente fare una richesta a http://dominio/team/details in quanto abbiamo bisogno di un terzo parametro (oltre a controller ed action) ovvero un identificatore della squadra corrente. Basterà quindi richiedere il seguente url:
http://dominio/team/details/12
Questo significherà: instanzia il controller Team e invoca la sua azione list passandogli come parametro id il valore 12. A questo punto sarà il controller che, in base al parametro ricevuto, recupererà le informazioni necessarie da mostrare all’utente.
Questi due pattern di url sono quelli “convenzionati” con Rails, ma ovviamente possiamo crearne di nuovi in base alle nostre esigenze tramite una modifica al file config/routes.rb (che analizzeremo del dettaglio successivamente).
Per adesso accontentiamoci diaver capito i pattern forniti di default con Rails che potremmo scrivere in questo maniera più generale:
:controller/:action # per esempio http://dominio/team/list :controller/:action/:id # per esempio http://dominio/team/details/12