Problemini con le view


#1

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…


#2

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


#3

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


#4

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


#5

2009/4/6 jamba jamba 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