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

Popolare i file HTML

Come integrare codice Ruby all'interno dei file .rhtml che contengono il codice HTML di visualizzazione
Come integrare codice Ruby all'interno dei file .rhtml che contengono il codice HTML di visualizzazione
Link copiato negli appunti

Iniziamo con l'avviare il Web server attraverso script/server  e colleghiamoci a http://127.0.0.1:3000/home, dovrebbe essere visibile un messaggio che dice "Find me in app/views/home/index.rhtml". 

Ogni azione infatti corrisponde ad un un file azione.rhtml nella cartella app/views/nome_controller, ed infatti aprendolo troveremo uno spezzone di HTML.

Per utilizzare la variabile @topics dobbiamo utilizzare del codice ruby embedded nell'HTML, quindi apriamo il file app/views/home/index.rhtml e sostituiamone il contenuto con questo:

<h1>HForum, Ultimate Bulletin Board</h1>
<p>I forum disponibili sono</p>
 
<ul>
<% for topic in @topics %>
   <li><%= topic.title %></li>
<% end %>
</ul>

Come vedete usiamo due tag differenti per il codice Ruby, ovvero <% codice %> e <%= codice %>. La differenza è semplice: nel primo caso non ci importa del risultato (la sintassi for.. end non dà risultati utili) mentre nel secondo vogliamo prendere il risultato e metterlo nel nostro codice, in modo simile all'uso di echo in PHP, o alla sintassi identica in JSP.

Provate ad accedere ora alla pagina modificata, senza riavviare il server, e dovreste vedere una lista dei topic disponibili. In verità potete quasi dimenticarvi del server in quanto non ci sarà bisogno di riavviarlo mai finché lavoriamo in modalità di sviluppo, ed in particolare finché modifichiamo controller e viste, che vengono ricaricate automaticamente dopo ogni cambiamento. 

Se la vostra lista è ancora composta di un solo topic provate ad aggiungerne altri da console, tanto per rendere l'applicazione più realistica. Magari provate ad utilizzare il metodo Topic.create(:title=>"titolo"), un altro metodo autogenerato che crea un oggetto e lo salva immediatamente.

Però vedere i forum in questo modo non è molto utile, sarebbe più comodo se quelli fossero dei link. Modifichiamo quindi la pagina, inserendo anche il timestamp già che ci siamo:

<ul>
  <% for topic in @topics %>
    <li><%= link_to topic.title, :action=>"show", :id=>topic.id %> (ultima modifica: <%= topic.updated_at.to_s(:short) %>)</li>
  <% end %>
</ul>

Il metodo to_s serve a convertire qualcosa in una stringa, e lo vedrete spesso in Ruby, in quanto il linguaggio non effettua trasformazioni automatiche tra i tipi come Perl o PHP. L'argomento serve a specificare che vogliamo una rappresentazione compatta dell'orario.  Il metodo link_to serve appunto a costruire un link. Il primo argomento deve essere una stringa, e sarà la cosa che viene mostrata all'utente, mentre gli elementi seguenti servono a costruire un URL. 

Ricordate che Rails effettua un'analisi degli URL come http:// hostname/controller/azione/id? Beh, vale anche il contrario, se specifichiamo controller, azione ed id possiamo costruire un URL. In realtà i vari pezzetti sono opzionali, quindi possiamo specificare un controller ma non un'azione oppure entrambi e non l'id oppure altri parametri e così via.

Ora però c'è il problema che se seguiamo il link non succede niente, quindi definiamo il contenuto dell'azione show in modo appropriato:

def show
 @topic =Topic.find(params['id'])
end

Potete vedere che utilizziamo params per accedere agli argomenti ricevuti tramite GET (ma se fossero stati inviati via form con POST sarebbe stata la stessa cosa). Si tratta di un metodo che ereditiamo da ActionController::Base e che restituisce un insieme di coppie chiave/valore, utilizzando la sintassi oggetto[chiave] possiamo ottenere il valore che ci interessa, nel nostro caso, il valore associato all'id del topic. Ricordate che in Ruby è possibile non mettere esplicitamente le parentesi, e che params è equivalente a params().

Modifichiamo ora il codice della vista, cioè il file app/views/home/show.rhtml:

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

<% for message in @topic.messages %>
  <div>
    <h4><%= message.author.name %> ha detto</h4>
    <p>
      <%= message.body %>
    </p>
  </div>
<% end %>

Davvero molto semplice. 

Fin qui abbiamo visto come viene strutturata alla base una tipica applicazione. I modelli si occupano di tenere traccia dei dati, e di fornire un'interfaccia semplice per manipolarli. I controller si occupano di prendere le informazioni e renderle disponibili alle viste tramite variabili d'istanza. Infine, le viste usano codice Ruby embedded nell'HTML per mostrare i dati ricevuti dai controller.

Ti consigliamo anche