A questo punto possiamo cominciare a costruire la nostra applicazione. La prima cosa che desideriamo è la possibilità di visualizzare la lista dei topic e secondariamente visualizzare i messaggi per ognuno di essi.
Creiamo quindi un controller chiamato Home
tramite il solito script/generate
ma passandogli due argomenti aggiuntivi, che servono a far costruire il codice base per delle azioni. Le azioni che creeremo sono due, ovvero un'azione show
che mostri tutti i messaggi per un topic, e un'azione chiamata index
. Quest'ultima è un po' speciale, in quanto è l'azione che viene richiamato di default quando accederete a http://hostname/home.
$ ruby script/generate controller Home index show
exists app/controllers/
exists app/helpers/
create app/views/home
exists test/functional/
create app/controllers/home_controller.rb
create test/functional/home_controller_test.rb
create app/helpers/home_helper.rb
create app/views/home/index.rhtml
create app/views/home/show.rhtml
Come già visto in precedenza, il comando crea una classe HomeController
in app/controller/home_controller.rb, un helper e un file per scrivere i test di questo controller.
Inoltre, poiché abbiamo aggiunto gli argomenti index
e show
sono stati creati anche due file .rhtml, ovvero due viste, che vedremo fra poco. Ad ogni vista corrisponde un metodo, e quindi nel codice del controller sono stati creati anche quelli:
class HomeController < ApplicationController
def index
end
def show
end
end
Ricordiamo che il def
in Ruby serve a definire un metodo.
Questi metodi sono vuoti ma in realtà dovrebbero occuparsi si trovare le informazioni che vogliamo, quindi ridefiniamo il metodo index
in app/controllers/home_controller.rb
sostituendo quello vuoto con questo:
def index
@topics = Topic.find(:all)
end
Se vi state chiedendo cosa sia quella cosa con la chiocciola state tranquilli. In Ruby come abbiamo visto, non c'è una parte dedicata alle dichiarazioni, e l'interprete potrebbe non capire quando parlate di una variabile d'istanza visibile in tutto l'oggetto o quando parlate di una variabile locale. Quindi le variabili d'istanza devono avere una "@
" davanti, potete vederlo come un this
in Java o PHP ma più conciso.
A questo punto è possibile anche spiegare il significato della stringa che viene mostrata in console quando lavoriamo con gli oggetti, ad esempio:
#<Entry:0x3991690 @new_record=true, @attributes={"created_on"=>nil, "url"=>"", "comment"=>""}>
Significa che abbiamo un oggetto di classe Entry
, identificato da un numero esadecimale che dice dove si trova in memoria, il quale ha due variabili d'istanza chiamate rispettivamente @new_record
e @attributes
. La prima ha un valore booleano, ed indica che l'oggetto è stato creato da zero e non recuperato dal database, mentre la seconda è un Hash e contiene i vari attributi dell'oggetto come coppie nome/valore.
Ma, tornando all'azione index
, perché mettiamo dei valori nella variabile @topic
? Semplicemente perché le variabili d'istanza sono visibili anche nel file .rhtml, come vedremo fra poco.