Forum: Italian Ruby user group problemini con le view

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
jamba j. (Guest)
on 2009-04-03 01:41
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...
Pietro G. (Guest)
on 2009-04-03 11:51
(Received via mailing list)
Il 2 aprile 2009 23.41, jamba jamba <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
jamba j. (Guest)
on 2009-04-03 12:20
mille grazie. sembra abbastanza chiaro. questa sera provo e vediamo se
risolvo...
jamba j. (Guest)
on 2009-04-07 00:03
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)

 <table>
    <% @customers.each do |c| %>
      <tr class="<%=cycle('list-line-odd', 'list-line-even') %>">


        <td class="list-descriprion">
          <dl>
            <dt><%= link_to c.surname, customer_path(customers), :action
=>'edit'%></dt>
            <dt><%= link_to c.type,
customer_types_path(customer_type)%></dt>

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

</div>

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
Pietro G. (Guest)
on 2009-04-07 10:45
(Received via mailing list)
2009/4/6 jamba jamba <removed_email_address@domain.invalid>:
> <% @customers.each do |c| %>
>   ...
>   <dt><%= link_to c.surname, customer_path(customers), :action => 'edit'%></dt>
>   <dt><%= link_to c.type, customer_types_path(customer_type)%></dt>
>   ...
> <% end %>


prova
così:<% @customers.each do |c| %>
  ...
  <dt><%= link_to c.surname, customer_path(c), :action => 'edit'%></dt>
  <dt><%= link_to c.type, customer_types_path(c.customer_type)%></dt>
  ...
<% end %>

pietro
This topic is locked and can not be replied to.