Salve,
sono alle prime armi con ruby on rails. Per iniziare ad imparare
qualcosa di concreto ho seguito alla lettera il libro “Agile web
development with rails”, che propone lo sviluppo passo-passo di
un’applicazione rails chiamata “Depot”; si tratta di una libreria on
line.
Tra le tante cose belle e interessanti che aiuta a realizzare, non dice
come implementare una cosa per me fondamentale, cioè un menù con una
lista di categorie. Questa lista vorrei che risiedesse in una sidebar e
ogni categoria sia un link che, una volta cliccato, consentisse di
visualizzare tutti i libri che appartengono a quella categoria.
Io ho iniziato a fare così:
Innanzi tutto ho due tabelle “Products” e “Categories”
Nel modello di “Products” ho scritto l’istruzione -> belongs_to
:category
Nel modello di “Categories” ho scritto l’istruzione -> has_many
:products
Quindi nella tabella Products c’è il campo “category_id”(chiave esterna)
e nella tabella Categories c’è la sua chiave primaria.
Ora nella mia applicazione, mi trovo un controllore chiamato
“store_controller” e nella relativa vista “Index” è implementata la
visualizzazione del catalogo prodotti. Solo che al momento visualizza
tutti i libri indistintamente.
Io vorrei che quando clicco il link relativo ad una categoria la vista
“index” del controllore “store_controller” mi visualizzi solo i libri di
quella categoria. La stessa cosa deve succedere cliccando i link di
altre categorie.
A questo punto ho realizzato il menù delle categorie all’interno di un
layout (che agisce su tutti i controllori dell’applicazione) in questo
modo:
<% for category in @categories -%>
All’interno del link_to ho specificato “:action => :index” e “:id =>
category” appunto perchè la vista index di store visualizzi l’elenco dei
prodotti corrispondenti a quella categoria (passo infatti l’id della
categoria).
Allora nello store_controller ho pensato di fare così:
def index
@categories = Category.find(params[:id])
@products = Product.find(:all, :order => “articolo”, :conditions =>
[‘category_id = ?’, @categories.id])
end
Ho pensato che in una variabile di istanza acquisisco l’oggetto category
e poi faccio estrarre dalla tabella prodotti, soltanto i prodotti per i
quali è verificata l’uguaglianza tra la chiave esterna (“category_id”) e
la chiave primaria della categoria (@categories.id).
Purtroppo al momento di eseguire l’applicazione mi dà errore nel layout
“store.html.erb”, precisamente nel ciclo “for” del seguente blocco di
codice:
<% for category in @categories -%>
L’errore visualizzato è: undefined method `each’ for
#Category:0x6234438
Sicuramente avrò scritto qualche cavolata.
Spero che qualcuno mi dia una mano.