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.