# Creazione di un menÃ¹ "Categorie"

**URL:** <https://www.ruby-forum.com/t/creazione-di-un-mena-categorie/194817>\
**Category:** IT\
**Created:** [September 11, 2010, 9:30am UTC](https://www.ruby-forum.com/t/creazione-di-un-mena-categorie/194817 "2010-09-11T09:30:39Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![stanley](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/7ab992/32.png) [@stanley](https://www.ruby-forum.com/u/stanley)\
**Post date:** [September 11, 2010, 9:30am UTC](https://www.ruby-forum.com/t/creazione-di-un-mena-categorie/194817/1 "2010-09-11T09:30:39Z")

</div>

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 -%\>

- \<%= link\_to(h(category.description), :controller =\> :store, :action =\> :index, :id =\> category) %\>
\<%end%\>

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 -%\>

- \<%= link\_to(h(category.description), :controller =\> :store, :action =\> :index, :id =\> category) %\>
\<%end%\>

L’errore visualizzato Ã¨: undefined method `each’ for  
#Category:0x6234438

Sicuramente avrÃ² scritto qualche cavolata.  
Spero che qualcuno mi dia una mano.

---

<div class="post-metadata">

**Author:** ![stanley](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/7ab992/32.png) [@stanley](https://www.ruby-forum.com/u/stanley)\
**Post date:** [September 11, 2010, 10:32am UTC](https://www.ruby-forum.com/t/creazione-di-un-mena-categorie/194817/2 "2010-09-11T10:32:55Z")

</div>

ciao Andrea 😉

venendo direttamente alla tua domanda, il problema è che

@categories = Category.find(params[:id])

restituisce 1 solo oggetto, non un array di oggetti. per avere la lista  
di tutte le categorie, dovresti usare questa istruzione:

@categories = Category.all # oppure Category.find(:all)

quanto ai prodotti specifici per una categoria, potresti usare questa  
forma:

@products = Product.find(:all, :order =\> “articolo”, :conditions =\>  
[‘category\_id = ?’, params[:id]])

ad ogni modo fai attenzione, perchè se stai usando un’edizione di Agile  
Web D. With Rails precedente alla 4a edizione, il codice fa  
riferimento come minimo a Rails 2.2.x (nel caso della 3a edizione). Ma  
è da poco uscito Rails 3.0.0 che porta con sè diverse migliorie e  
cambiamenti, in questo caso anche la sintassi è leggermente diversa.

ciao,  
A.

Il 11/09/2010 09:30, Andrea Patanè ha scritto:
