Il passaggio di dati dalla vista al controller avviene per mezzo della variabile params, un hash che contiene tutti i parametri disponibili condivisi sia al controller che alla vista. Per osservare il funzionamento della variabile params modifichiamo il layout che abbiamo utilizzato per tutte le viste, app/views/layouts/standard.html.erb, e introduciamo il codice per visualizzare in testa a tutte le pagine HTML il contenuto della variabile params:
... </head> <body> <%= debug(params) %> <p style="color: green"><%= flash[:notice] %></p> ...
Puntando il browser all'indirizzo http://0.0.0.0:3000/bookmarks vedremo apparire in testa alla pagina un rettangolo grigio che ci informa del contenuto della variabile:
--- !map:HashWithIndifferentAccess action: index controller: bookmarks
I parametri disponibili sono quindi action e controller, che identificano il controller e la action attivati. Se proviamo a selezionare il link show in calce a uno dei bookmark visualizzati, il contenuto della variabile params cambierà in:
--- !map:HashWithIndifferentAccess action: show id: "1" controller: bookmarks
Ora è apparso il parametro id, che è utilizzato dalla action show del controller BookmarksController per estrarre il bookmark che si vuole visualizzare:
@bookmark = Bookmark.find(params[:id])
Nei due esempi appena visti i parametri sono espresso tramite l'URL che richiama la pagina che si vuole visualizzare. Proviamo ora a realizzare un form; inseriamo il seguente codice nella vista app/views/bookmarks/index.html.erb:
<h1>Listing bookmarks</h1>
<% form_tag '/bookmarks', :method => :get do -%>
<%= label_tag 'some_text' %>
<%= text_field_tag 'some_text' %>
<%= submit_tag 'Ok' %>
<% end -%>
<ul>
<% for bookmark in @bookmarks %>
...
L'istruzione form_tag segnala l'inizio del form, che si conclude con l'istruzione end; '/bookmarks' indica il path della action da abbinare al form mentre :method => :get indica il metodo HTTP da utilizzare per l'invio del form.
All'interno del blocco del form appaiono in ordine: il tag per generare la label da abbinare al text field con id 'some_text', il text field e il bottone di submit che avrà come etichetta 'Ok'.
Compilando il text field e premendo il pulsante Ok siamo riportati sulla stessa pagina, ma la variabile params contiene ora il valore del text field e la label del bottone utilizzato per il submit del form:
--- !map:HashWithIndifferentAccess commit: Ok action: index some_text: lorem ipsum controller: bookmarks
La action show del controller bookmarks potrà quindi accedere a questi parametri utilizzando params[:some_text] e params[:commit], ed elaborare i dati secondo la logica dell'applicazione.
È possibile costruire form più complessi; oltre al text_field_tag, Rails mette a disposizione differenti tag per la generazione di input differenti, fra cui:
text_area_tag- per la generazione di input di tipo text areacheck_box_tag- per i check bokradio_button_tag- per i radio buttonpassword_fied_tag- per gli input di tipo passwordselect_tag- per la generazione di liste a discesa
Abbinando un id differente ad ogni tag introdotto nel form si possono rendere disponibili i valori dei differenti campi al controller, e quindi intercettare l'input dell'utente per utilizzarlo nel codice del controller. Dovrà essere nostra cura controllare la bontà dei dati inseriti dall'utente prima di utilizzarli nel codice dell'applicazione.