Problema banale con le variabili

Andrea P. wrote:

se all’inzio dell’action hai istanziato

@fattura = Invoice.find(params[:id])

allora nella view dovresti mettere:

:filename => “#{fattura.number}.pdf”

in pratica, quello che dichiari nella action, lo ritrovi nella view =P

ciao,
A.

jamba jamba ha scritto:

:filename => “#{fattura.number}.pdf” lo devo mettere nel action. serve
a pdf-write per generare il pdf.
nella view meto un semplice link_to solo che non sono completare
:id=>???

ok, nella view se metti:

:id => @fattura

dovrebbe comunque riferirsi all’id della fattura che vuoi usare.

presumo che più o meno, tu faccia questo (esempio semplificato, per
capire):

  • hai una lista di fatture, è una view “index.html.erb” generata da un
    controller con un’action “index”
  • ogni fattura ha una action “show” per essere mostrata (qui hai
    instanziato una “@fattura”)
  • quando visualizzi una fattura, hai un link che punta all’azione per
    generare il pdf

in questo caso, nella view avresti:

link_to ‘Stampa PDF’, :action => ‘pdf’, :id => @fattura

in questo modo dovrebbe funzionare =P

ciao,
A.

jamba jamba ha scritto:

deve trattarsi di un errore talmente scemo che appena lo scoprirai darai
testate al muro per penitenza =P

a questo punto prova a specificare anche il controller, e metti l’id in
modo esplicito

link_to ‘Stampa PDF’, :controller => ‘tuo_controller’, :action => ‘pdf’,
:id => @fattura.id

controlla anche il ‘config/routes.rb’ perchè ho come l’impressione che
l’errore si riferisca ad una errata gestione dei parametri…

altra cosa, ti consiglio di sfruttare la console di rails (
./script/console ) per fare prove con i modelli. almeno nel mio caso, è
stata un ottimo aiuto per capire/testare certi meccanismi =P

ciao,
A.

jamba jamba ha scritto:

in questo modo dovrebbe funzionare =P

Couldn’t find Invoice with ID=pdf

sto gettando la spugna… :frowning:

2009/6/10 jamba jamba [email protected]:

il controller lo specifico già. ma devo usare @fattura o @fattura.id?
nel secondo caso:
Called id for nil, which would mistakenly be 4 – if you really wanted
the id of nil, use object_id

questo significa che nella vista in cui hai il link_to la variabile
@fattura ha il valore nil e non e’ un’istanza del modello Fattura.
i.e. nella action del controller che poi fa il render di quella vista
non hai assegnato @fattura = qualcosa…
Quale e’ il codice della action che genera la pagina in cui e’ presente
il link?

ciao,
Luca

Andrea P. wrote:

deve trattarsi di un errore talmente scemo che appena lo scoprirai darai
testate al muro per penitenza =P

a questo punto prova a specificare anche il controller, e metti l’id in
modo esplicito

link_to ‘Stampa PDF’, :controller => ‘tuo_controller’, :action => ‘pdf’,
:id => @fattura.id

controlla anche il ‘config/routes.rb’ perch� ho come l’impressione che
l’errore si riferisca ad una errata gestione dei parametri…

altra cosa, ti consiglio di sfruttare la console di rails (
./script/console ) per fare prove con i modelli. almeno nel mio caso, �
stata un ottimo aiuto per capire/testare certi meccanismi =P

ciao,
A.

jamba jamba ha scritto:

il controller lo specifico già . ma devo usare @fattura o @fattura.id?
nel secondo caso:
Called id for nil, which would mistakenly be 4 – if you really wanted
the id of nil, use object_id

ad ogni modo do un occhio a routes.rb

sembra che l’oggetto @fattura non esista…

ok, facciamo un passo indietro: puoi incollare qui l’action che mostra
la fattura? (presumo si chiami ‘show’)

a questo punto non è importante l’action del pdf, bensì quella che
dovrebbe instanziare l’oggetto @fattura che poi userai nella view.

non ho idea del dove/quando chiami l’action per il pdf, ma bisogna
conoscere anche chi/cosa instanzia l’oggetto da usare nel link_to.

spesso, soprattutto con un framework come rails, occorre avere una
visione dall’alto della situazione. un errore che compare in un
determinato punto, potrebbe risalire molto più indietro di quanto
pensi… =)

A.

jamba jamba ha scritto:

ok per quel codice, ma vorrei capire un paio di cose:

qual’è la action relativa alla view che contiene il “link_to” per la
generazione del pdf ? nel caso che questa action sia ‘edit’, vuol dire
che link_to dovrebbe essere:

link_to ‘Stampa PDF’, :controller => ‘tuo_controller’, :action => ‘pdf’,
:id => @invoice

tuttavia in ‘edit’ chiami la action ‘invoice_form’, tieni presente che
se è questa a generare la view, devi instanziare comunque un oggetto da
usare…

ciao,
A.

jamba jamba ha scritto:

l’action che utilizzo per mostrare (e modificare) la fattura è edit
def edit
@invoice = Invoice.find(params[:id], :include => :customer)
@customer = @invoice.customer
@invoice_line = InvoiceLine.new

@customers = Customer.find(:all)

respond_to do |format|
  format.html { render :action => "invoice_form" }
end

end

poi sempre nello stesso controller ho l’action pdf

def pdf
numero = Invoice.find(:all, :order=>‘number’)
_pdf = PDF::Writer.new
_pdf.select_font “Times-Roman”
_pdf.text “Studio Faletra”, :font_size => 20, :justification =>
:left
_pdf.line(50, 690, 560, 690).stroke

send_data _pdf.render, :filename => "#{numero.number}.pdf", :type => 

“application/pdf”
end

Andrea P. wrote:

sembra che l’oggetto @fattura non esista…

ok, facciamo un passo indietro: puoi incollare qui l’action che mostra
la fattura? (presumo si chiami ‘show’)

a questo punto non è importante l’action del pdf, bensì quella che
dovrebbe instanziare l’oggetto @fattura che poi userai nella view.

non ho idea del dove/quando chiami l’action per il pdf, ma bisogna
conoscere anche chi/cosa instanzia l’oggetto da usare nel link_to.

spesso, soprattutto con un framework come rails, occorre avere una
visione dall’alto della situazione. un errore che compare in un
determinato punto, potrebbe risalire molto più indietro di quanto
pensi… =)

A.

jamba jamba ha scritto:

def pdf
numero = Invoice.find(:all, :order=>‘number’)
_pdf = PDF::Writer.new
_pdf.select_font “Times-Roman”
_pdf.text “Studio Faletra”, :font_size => 20, :justification =>
:left
_pdf.line(50, 690, 560, 690).stroke

send_data _pdf.render, :filename => "#{numero.number}.pdf", :type => 

“application/pdf”
end

Leggo distrattamente ma mi pare di vedere un errore: la variabile numero
è associata ad una colletion di invoices, mentre poi chiami
numero.number che dubito sia un metodo relativo ad una collection…

ho fatto una modifica che credo renda più lineare l’utilizzo. per
stampare una fattura non richiamo più l’action edit.
nella view che mostra tutte le fatture in forma tabellare, all’interno
della tabella ho inserito una colonna che per ogni fattura una icona
linkata ad una action caratteristica edit, delete e appunto pdf.
in questo modo non passo più per l’action edit.
il problema però resta…

Andrea P. wrote:

ok per quel codice, ma vorrei capire un paio di cose:

qual’� la action relativa alla view che contiene il “link_to” per la
generazione del pdf ? nel caso che questa action sia ‘edit’, vuol dire
che link_to dovrebbe essere:

link_to ‘Stampa PDF’, :controller => ‘tuo_controller’, :action => ‘pdf’,
:id => @invoice

tuttavia in ‘edit’ chiami la action ‘invoice_form’, tieni presente che
se � questa a generare la view, devi instanziare comunque un oggetto da
usare…

ciao,
A.

jamba jamba ha scritto:

Leggo distrattamente ma mi pare di vedere un errore: la variabile numero
è associata ad una colletion di invoices, mentre poi chiami
numero.number che dubito sia un metodo relativo ad una collection…

number è un campo di una tabella del DB. (invoices)

Il giorno 11 giugno 2009 8.45, jamba jamba[email protected] ha
scritto:


def pdf
numero = Invoice.find(:all, :order=>‘number’)

end

ribadisco: tu vuoi rendere in pdf una sola invoice, quindi perché scrivi
:all?

@invoice = Invoice.find(params[:id])


send_data _pdf.render, :filename => “#{@invoice.number}.pdf”, :type =>
“application/pdf”

pietro

2009/6/11 jamba jamba [email protected]:

Leggo distrattamente ma mi pare di vedere un errore: la variabile numero
è associata ad una colletion di invoices, mentre poi chiami
numero.number che dubito sia un metodo relativo ad una collection…

number è un campo di una tabella del DB. (invoices)

gia’ ma questo:

numero = Invoice.find(:all, :order=>‘number’)

NON trova una Invoice (i.e. un record) bensi’ una lista di invoice (il
parametro :all significa “tutti i record”).

Dovresti fare invece:

numero = Invoice.find( )

dove deve essere l’id che vuoi trovare, come lo
ottieni nell’action dipende da come la chiami, ad esempio se la chiami
con:

/nomecontroller/pdf/10

troverai l’id ‘10’ in params[:id]

N.B. per fare un test del resto del codice dell’action puoi anche
scrivere direttamente nel codice il valore di un ID che sai esistere:

numero = Invoice.find( 1 )

ciao,
Luca

Luca M. wrote:

2009/6/11 jamba jamba [email protected]:

Leggo distrattamente ma mi pare di vedere un errore: la variabile numero
� associata ad una colletion di invoices, mentre poi chiami
numero.number che dubito sia un metodo relativo ad una collection…

number � un campo di una tabella del DB. (invoices)

gia’ ma questo:

numero = Invoice.find(:all, :order=>‘number’)

NON trova una Invoice (i.e. un record) bensi’ una lista di invoice (il
parametro :all significa “tutti i record”).

Dovresti fare invece:

numero = Invoice.find( )

ok grazie a san google sono giunto un attimo fa allo stesso risultato.
il pdf viene creato. solo che non voglio che il nome del file sia L’ID
ma il numero della fattura. l’action l’ho modificata in questo modo:

def pdf
@n = Invoice.find(:all)
_pdf = PDF::Writer.new
_pdf.select_font “Times-Roman”
_pdf.text “test”, :font_size => 20, :justification => :left
_pdf.line(50, 690, 560, 690).stroke
send_data _pdf.render,
:type => “application/pdf”,
:disposition => ‘inline’,
:filename => @d.to_s + “.pdf”
end

in questo modo appunto funziona, ma se a:
:filename => @d.to_s + “.pdf”

aggiungo

:filename => @d.number.to_s + “.pdf”

ottengo:
You have a nil object when you didn’t expect it!
The error occurred while evaluating nil.number

ci sono quasi ormai…
secondo voi la definziione di tutto il file pdf che trovi nell’action
sopra è più corretto che si trovi nel controller come è adesso, oppure è
meglio che la metta da qualche altra parte e poi la richiami
nell’action?

Non vorrei sembrare pedante, ma…

2009/6/11 jamba jamba [email protected]:

ok grazie a san google sono giunto un attimo fa allo stesso risultato.

hmm non credo perche’ nel codice qui sotto continui ad usare il
find(:all), inoltre (partendo dall’assunzione che quello postato sia
il codice completo dell’action):

def pdf
@n = Invoice.find(:all)

qui assegni la variabile di istanza @n con la lista di invoice

send_data _pdf.render,
                       :type => "application/pdf",
                       :disposition => 'inline',
                       :filename => @d.to_s + ".pdf"

qui usi la variabile di istanza @d che NON hai assegnato da nessuna
parte i.e. e’ nil, vuota

:filename => @d.number.to_s + “.pdf”

ottengo:
You have a nil object when you didn’t expect it!
The error occurred while evaluating nil.number

CVD vedi sopra :wink:

Luca

jamba jamba ha scritto:

 send_data _pdf.render,

:filename => @d.number.to_s + “.pdf”

ottengo:
You have a nil object when you didn’t expect it!
The error occurred while evaluating nil.number

again: se dichiari @n, chi sarebbe @d ?

altri hanno già fatto notare che se devi stampare una sola fattura, non
ha senso che le cerchi tutte =P

la forma @d.number.to_s + “.pdf” è meno efficente, ricordi che qualcuno
lo ha corretto proprio in questo thread? =)

ci sono quasi ormai…
secondo voi la definziione di tutto il file pdf che trovi nell’action
sopra è più corretto che si trovi nel controller come è adesso, oppure è
meglio che la metta da qualche altra parte e poi la richiami
nell’action?

in teoria dipende: se già sai (o prevedi) che la conversione in pdf non
sarà specifica solo per le fatture, ma si estenderà anche ad altri
documenti, allora credo sia più logico spostare il codice altrove =P
in pratica, se estrapoli quel codice e lo tieni separato, magari
potresti riutilizzarlo per altri progetti, o condividerlo, etc…

ciao,
A.

che stupido…