Creazione di un menù "Categorie"

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.

    ciao Andrea :wink:

    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: