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

I form in Ruby - II

Come si creano moduli di interazione con l'utente in Ruby on Rails: gli helper della libreria ActionPack
Come si creano moduli di interazione con l'utente in Ruby on Rails: gli helper della libreria ActionPack
Link copiato negli appunti

Visualizziamo, per comodità, il codice che abbiamo incluso nella lezione precedente all'interno del file show.rhtml (app/views/entries/show.rhtml):

<h2><%= @topic.title %> </h2>

<%= render(:partial => "message", :collection=>@topic.messages ) %>
  
<h3>Aggiungi un nuovo messaggio</h3>

<form action="/home/add_message" method="post">
  Testo: <%= text_area_tag "body" %>
  <%= hidden_field_tag "topic_id", @topic.id %>
   <br />
   <%= submit_tag("Aggiungi messaggio") %>
</form>

In questo codice usiamo dei semplici metodi che generano il codice HTML per un'area destinata al corpo del messaggio, per un campo nascosto (che servirà a trasmettere l'id del topic) ed per un bottone che invii i dati. Questi metodi sono degli helper, e sono forniti dalla libreria di Rails relativa a controller e viste, chiamata ActionPack. Il compito di un helper è di generare del codice HTML, e la sua utilità è nel far sì che il codice rimanga semplice, racchiudendo delle funzionalità anche complesse in un unico punto.

Ovviamente in questo caso stiamo usando degli helper di livello molto basso, ed il vantaggio rispetto all'uso di HTML semplice è minore, ma maggiore sarà la complessità degli helper maggiore sarà il risparmio di tempo che proviene dal loro uso, come ad esempio per l'uso di funzionalità AJAX.

Sia hidden_field_tag sia text_area_tag (evidenziati in rosso nel codice precedente) accettano diversi argomenti, il primo è relativo al nome che verrà usato per indicare i dati inviati dalla form, mentre il secondo è il valore predefinito di questi dati. L'argomento usato per submit_tag corrisponde all'attributo value in HTML, e quindi è il testo che verrà mostrato sul bottone della form. 

Il form fa riferimento a una nuova azione, che definiremo sempre all'interno della classe HomeController in questo modo:

def add_message
  topic=Topic.find(params['topic_id'])
  message=Message.new(:body=>params['body'])
  message.topic=topic
  message.author=find_author()
  message.save
  redirect_to(:back)
end

In questo codice possiamo scoprire due cose nuove: anzitutto, possiamo vedere come i valori del form siano accessibili con il nome che gli abbiamo assegnato (il primo argomento di hidden_field_tag e text_area_tag) tramite params, indipendentemente dal fatto che le richieste siano fatte via GET o via POST. Poi vediamo il metodo redirect_to, che appunto reindirizza il browser dell'utente  verso un'altra azione. Anche nel caso di redirect_to, come nel caso di link_to,possiamo specificare un controller, un'azione e argomenti opzionali, ed in più abbiamo la possibilità di usare come argomento il simbolo :back, che farà si che l'utente sia reindirizzato alla pagina da cui proviene. 

Ora il significato di questo codice dovrebbe essere comprensibile: nel momento in cui l'utente invia i dati cliccando il bottone del form, essi arrivano a questa azione dove vengono utilizzati per creare un nuovo messaggio, associarlo ad un topic e ad un autore e poi salvarlo nel database. L'utente viene poi reindirizzato di nuovo alla pagina dalla quale aveva inviato il form, permettendogli di vedere il risultato dell'operazione. 

Sarebbe possibile ora creare una nuova azione che permetta agli utenti di aggiungere un nuovo topic in modo assolutamente identico, ma preferiamo avere una pagina separata, quindi aggiungiamo un link ad essa in index.rhtml:

<p> <%= link_to("Aggiungi un nuovo Topic", :action=>"add_topic") %></p>

Per gestire i topic, useremo una nuova azione, add_topic, ancora nel controller HomeController, con una vista di questo tipo:

<h2>Aggiungi un nuovo topic</h2>
<form action="add_topic" method="post">
 Titolo: <%= text_field_tag("title") %>
 <br />
 Testo: <%= text_area_tag("body") %>
 <br />
 <%= submit_tag("aggiungi") %>
</form>

Come potete notare guardando l'attributo action della form, i dati vengono di nuovo inviati alla stessa azione, che definiremo in questo modo:

def add_topic
   if request.post?
       topic=Topic.new(:title=>params['title'])
       message=Message.new(:body=>params['body'])
       message.topic=topic
       message.author= find_author( )
       message.save
     redirect_to(:action=>'index')
   end
end

Il codice è grossomodo equivalente a quello già visto in precedenza, solo che invece di cercare un topic nel database ne creiamo uno nuovo con il titolo, titolo che è stato possibile inviare dalla form grazie text_field_tag

La differenza è nell'uso di request. Questo è un metodo (ancora una volta, Ruby permette di omettere le parentesi, ma avremmo potuto scrivere request().post?()) che permette di accedere alla richiesta appena fatta. L'oggetto restituito da request fornisce dei metodi, come appunto post?, che offrono la possibilità di capire come è stata effettuata la richiesta.

Poiché tutto il corpo di questo metodo è all'interno del blocco if, esso verrà eseguito solamente quando la richiesta è di tipo POST, ovvero quando c'è stato l'invio di una form. Invece, quando la richiesta è una GET request.post? sarà falso,  e ciò significa che non verrà eseguita nessuna operazione (anche qui avremmo comunque potuto usare un'azione differente come nel caso di add_message). 

Dunque, quando l'utente segue un link o accede tramite la barra degli indirizzi del suo browser a questa azione, gli verrà mostrata la pagina con la form, mentre quando egli inserisce i dati e li trasmette al server, l'azione li analizzerà e dopo aver creato gli oggetti, reindirizzerà l'utente verso la home page.

Ti consigliamo anche