# Problemini con le view

**URL:** <https://www.ruby-forum.com/t/problemini-con-le-view/164602>\
**Category:** IT\
**Created:** [April 2, 2009, 11:41pm UTC](https://www.ruby-forum.com/t/problemini-con-le-view/164602 "2009-04-02T23:41:31Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![jamba](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/bc8723/32.png) [@jamba](https://www.ruby-forum.com/u/jamba)\
**Post date:** [April 2, 2009, 11:41pm UTC](https://www.ruby-forum.com/t/problemini-con-le-view/164602/1 "2009-04-02T23:41:31Z")

</div>

Salve a tutti, dopo un paio di anni, ho ripreso un mio piccolo  
progettino in rails. premetto subito che non sono un programmatore di  
professione, e quindi sono un semplice schiaccia tasti, ad ogni modo il  
mio problema Ã¨ questo  
ho creato una serie di tabelle che ho messo in relazione nei model.  
ora vorrei che la home page faccia “da riepilogo” di alcui dati di varie  
tabelle.  
per esempio vorrei che contenesse il campo surname della tabella  
customers, il campo customer\_type della tabella type ecc… PerÃ² non  
riesco a farlo.  
Un altra cosa vorrei che alcnuci di questi elementi siano dei link. mi  
speigo meglio. Immaginate la home page con elenco di tutti i cognomi.  
vorrei che ogni singolo congnome si un link che parti all’azione edit  
del singolo campo. ho provato con link\_to, ma ho qualche problema…

---

<div class="post-metadata">

**Author:** ![jamba](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/bc8723/32.png) [@jamba](https://www.ruby-forum.com/u/jamba)\
**Post date:** [April 3, 2009, 9:51am UTC](https://www.ruby-forum.com/t/problemini-con-le-view/164602/2 "2009-04-03T09:51:50Z")

</div>

Il 2 aprile 2009 23.41, jamba jamba [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) ha scritto:

> ora vorrei che la home page faccia “da riepilogo” di alcui dati di varie  
> tabelle.

quello che devi fare è associare un controller alla home page; puoi  
scegliere di creare un controller ad hoc oppure puoi usarne uno che  
hai già, e il metodo invocato sarà index. per farlo, basta inserire  
dentro config/routes.rb la seguente riga:

map.root :controller =\> ‘ilmiocontroller’

(questa riga dev’essere ovviamente inserita all’interno del blocco do  
|map| … end).

> il campo customer\_type della tabella type  
> attenzione: chiamare una tabella type potrebbe non essere una buona  
> idea, perché esiste ancora, sebbene sia deprecato, un metodo type,  
> equivalente al metodo class, definito per tutti gli oggetti:

> > nil.type  
> > =\> NilClass  
> > @customer.type  
> > =\> Customer(id: …, …)

ti consiglio di rinominare la tabella o almeno la classe.

> per esempio vorrei che contenesse il campo surname della tabella  
> customers, il campo customer\_type della tabella type ecc… Però non  
> riesco a farlo.

nel metodo index del controller:

@customers = Customer.find :all

oppure, se sono tanti:

@customers = Customer.paginate :page =\> params[:page], :per\_page =\>  
params[:per\_page] || 20

in realtà questo non basta, cioè, funziona ma costringe rails ad  
effettuare molte più query del dovuto: dato che vuoi mostrare dati  
provenienti da molte tabelle, devi aggiungere un “:include =\> …”,  
che però non so dirti senza conoscere esattamente le associazioni che  
hai definito.

se, ad esempio, Customer has\_many :dogs e has\_one :house (scusa, non  
mi vengono esempi seri), scriverai:

@customers = Customer.find :all, :include [:dogs, :house]

nella view potrai scrivere:

\<% @customers.each do |c| %\>  
\<%= c.surname %\>  
\<%= c.house.color %\>  
…  
\<% end %\>

> Un altra cosa vorrei che alcnuci di questi elementi siano dei link. mi  
> speigo meglio. Immaginate la home page con elenco di tutti i cognomi.  
> vorrei che ogni singolo congnome si un link che parti all’azione edit  
> del singolo campo. ho provato con link\_to, ma ho qualche problema…

domanda: la tua applicazione è restful o no? hai usato scaffold per  
generare i controller e il resto?

la sintassi di link\_to è semplice ma, senza sapere come è organizzata  
la tua applicazione, non riesco a dirti esattamente cosa scrivere.

se l’applicazione è restful, sono già definite diverse url, per cui ti  
basta scrivere:

\<% @customers.each do |c| %\>  
\<%= link\_to c.surname, edit\_customer\_url(@c) %\>  
…  
\<% end %\>

se invece l’applicazione non è restful, potresti scrivere:

\<% @customers.each do |c| %\>  
\<%= link\_to c.surname, {:controller =\> :customer, :action =\> :edit} %\>  
\<% end %\>

anche per applicazioni non restful è però preferibile creare dei  
percorsi (named route) ad hoc, sia per maggiore leggibilità del  
codice, sia perché, se un giorno decidessi di rinominare un’action,  
dovresti modificare solo una riga e non (potenzialmente) migliaia.  
sempre in routes.rb, dentro il block, scrivi:

map.edit\_customer, ‘/customer/edit’, :controller =\> ‘customer’,  
:action =\> ‘edit’

(non prendere questi valori per certi: tutto dipende da come è  
strutturata la tua applicazione.)

così nella view scrivi:

\<% @customers.each do |c| %\>  
\<%= link\_to c.surname, edit\_customer\_url(:id =\> @customer) %\>  
\<% end %\>

spero di essere stato d’aiuto; scrivi ancora se hai  
difficoltà.  
pietro

---

<div class="post-metadata">

**Author:** ![jamba](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/bc8723/32.png) [@jamba](https://www.ruby-forum.com/u/jamba)\
**Post date:** [April 3, 2009, 10:20am UTC](https://www.ruby-forum.com/t/problemini-con-le-view/164602/3 "2009-04-03T10:20:16Z")

</div>

mille grazie. sembra abbastanza chiaro. questa sera provo e vediamo se  
risolvo…

---

<div class="post-metadata">

**Author:** ![jamba](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/bc8723/32.png) [@jamba](https://www.ruby-forum.com/u/jamba)\
**Post date:** [April 6, 2009, 10:03pm UTC](https://www.ruby-forum.com/t/problemini-con-le-view/164602/4 "2009-04-06T22:03:53Z")

</div>

qualche problemino c’Ã¨ l’ho ancora  
ho creato un controller home con una sola azione (index). ma ottengo  
questo errore  
undefined local variable or method `customers’ for  
#ActionView::Base:0x23b8da8

copio incollo i file interessati:

index.html.erb (home controller)

 \<% @customers.each do |c| %\> 

```
    <td class="list-descriprion">
      <dl>
        <dt><%= link_to c.surname, customer_path(customers), :action 

```

=\>‘edit’%\>

\<%= link\_to c.type,  
customer\_types\_path(customer\_type)%\>

```
      </dl>
    </td>
  </tr>
<% end %>

```

|
| |

HomeController  
class HomeController \< ApplicationController  
layout “customers”

def index  
@customers = Customer.find (:all, :include =\> [:customers\_type])

```
respond_to do |format|
  format.html # index.html.erb
  format.xml { render :xml => @customers }
end

```

end

end

model Customer  
class Customer \< ActiveRecord::Base  
belongs\_to :customers\_type  
has\_many :pratical

validates\_presence\_of :name, :surname, :address, :postal\_code, :city,  
:province

model customes\_type  
class CustomersType \< ActiveRecord::Base  
has\_many :customer  
end

dove sta l’errore?

grazie

---

<div class="post-metadata">

**Author:** ![jamba](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/bc8723/32.png) [@jamba](https://www.ruby-forum.com/u/jamba)\
**Post date:** [April 7, 2009, 8:45am UTC](https://www.ruby-forum.com/t/problemini-con-le-view/164602/5 "2009-04-07T08:45:13Z")

</div>

2009/4/6 jamba jamba [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> \<% @customers.each do |c| %\>  
> …
> 
> \<%= link\_to c.surname, customer\_path(customers), :action =\> 'edit'%\>\<%= link\_to c.type, customer\_types\_path(customer\_type)%\> ... \<% end %\>

prova  
così:\<% @customers.each do |c| %\>  
…

\<%= link\_to c.surname, customer\_path(c), :action =\> 'edit'%\>\<%= link\_to c.type, customer\_types\_path(c.customer\_type)%\> ... \<% end %\>

pietro
