Problema banale con le variabili


#1

Ho problema che è banalissimo, ma per me è stato uno sforzo enorme
arrivare fino a dove sono arrivato. ad ogni modo:
la mia applicazione con rails, funziona più o meno bene, sto studiano il
modo di stampare in pdf. utilizzo pdf-write. devo salvare il file.
quindi seguendo le api di pdf-writer:

send_data _pdf.render, :filename => (invoice.number+".pdf"), :type =>
“application/pdf”

io vorrei che il nome del file generato fosse quello di un campo di una
tabella. nello specifico il nuemro di una fattura. nella tabella
invoices o un campo chiamato number. quindi mi sembra logico richiamarla
con invocie.number.
perchè ottengo il messaggio di variabile o metodo inestente?

grazie


#2

“invoice” è già stato istanziato in qualche modo? altrimenti presumo sia
normale che non lo riconosca…

altra cosa, dovresti scrivere:

invoice.number.to_s + “.pdf”

se “number” è un valore integer, devi convertirlo in stringa per potergli
aggiungere “.pdf”

ciao =)
A.

jamba jamba ha scritto:


#3

Andrea P. wrote:

“invoice” � gi� stato istanziato in qualche modo? altrimenti presumo sia
normale che non lo riconosca…

altra cosa, dovresti scrivere:

invoice.number.to_s + “.pdf”

se “number” � un valore integer, devi convertirlo in stringa per potergli
aggiungere “.pdf”

ciao =)
A.

jamba jamba ha scritto:

altra cosetta…

invoice.number.to_s + “.pdf” come prestazioni è circa 10-20 volte +
lento di
“#{invoice.number}.pdf”


#4

Il giorno 8 giugno 2009 21.03, Alessandro S.removed_email_address@domain.invalid
ha scritto:

invoice.number.to_s + “.pdf” come prestazioni è circa 10-20 volte + lento di
“#{invoice.number}.pdf”

consiglio anch’io questa forma, anche per motivi di
leggibilità.
per il resto scrivi il codice in questione o comunque una parte
saliente.

pietro.


#5

Pietro G. wrote:

Il giorno 8 giugno 2009 21.03, Alessandro S.removed_email_address@domain.invalid
ha scritto:

invoice.number.to_s + “.pdf” come prestazioni � circa 10-20 volte + lento di
“#{invoice.number}.pdf”

consiglio anch’io questa forma, anche per motivi di
leggibilit�.
per il resto scrivi il codice in questione o comunque una parte
saliente.

pietro.

questo è la parte di codice incriminata

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

send_data _pdf.render, :filename => (@numero+".pdf"), :type => 

“application/pdf”
end


#6

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

send_data_pdf.render :filename =>
“#{fattura.campo_che_rappresenta_il_numero_della_fattura}.pdf”, …

Se ho preso una cantonata scrivi pi� dettagli.

pietro

a questa soluzione c’ero già giunto, il problema e che come risultato
ottengo:

Couldn’t find Invoice with ID=36303630


#7

Il giorno 9 giugno 2009 9.38, jamba jambaremoved_email_address@domain.invalid ha scritto:

a questa soluzione c’ero già giunto, il problema e che come risultato
ottengo:

Couldn’t find Invoice with ID=36303630

ma quest’id è giusto? che tipo di campo è? non credo sia un serial, o
hai già generato trentasei milioni di fatture? È la chiave primaria
del record?

pietro


#8

Il giorno 9 giugno 2009 8.58, jamba jambaremoved_email_address@domain.invalid ha scritto:

end
Invoice.find(:all) restituisce un proxy, un oggetto che sa diventare
lista o iteratore o altro, ma non è certamente un numero. quando fai
@numero + “.pdf”, ruby tenta di convertirli nello stesso tipo, e in
particolare cerca di trasformare “.pdf”, stringa, in un array.
Ovviamente fallisce.

Forse hai fatto un po’ di confusione, anche perché non credo tu voglia
stampare tutto in una volta; più probabilmente (correggimi se sbaglio)
vuoi stampare una fattura soltanto.

Se è così, probabilmente starai passando un id al metodo (vale a dire,
avrai una url tipo /invoice/pdf/3, o /invoice/3/pdf, o altro, e
all’interno del metodo quell’id sarà accessibile tramite params[:id].

Continuando con quest’ipotesi, il codice dovrebbe assomigliare a questo:

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

send_data_pdf.render :filename =>
“#{fattura.campo_che_rappresenta_il_numero_della_fattura}.pdf”, …

Se ho preso una cantonata scrivi più dettagli.

pietro


#9

Il giorno 9 giugno 2009 9.48, jamba jambaremoved_email_address@domain.invalid ha scritto:

la fattura la stampo tramite un link nella view in questo modo:

<%= link_to “PDF”, :controller => “invoices”, :action => “pdf”, :id =>
id %>

Bene; che cos’è id?
Molto probabilmente non è quello che vorresti; sarà l’id di chissà
che, dell’oggetto view, dell’oggetto response, vai a sapere.

Nel momento in cui mostri quel link, probabilmente hai un oggetto che
rappresenta la fattura in questione; chiamiamolo
oggetto_che_rappresenta_la_fattura_in_questione. Ecco, quello che vuoi
scrivere è

<%= link_to “PDF”, :controller => “invoices”, :action => “pdf”, :id =>
oggetto_che_rappresenta_la_fattura_in_questione.id %>

pietro


#10

Pietro G. wrote:

<%= link_to “PDF”, :controller => “invoices”, :action => “pdf”, :id =>
oggetto_che_rappresenta_la_fattura_in_questione.id %>

pietro

quasi ci siamo. ma oggetto_che_rappresenta:fattura_in_questione potrebbe
essere invoice (che sarebbe anche la tabella nel db) e quindi fare
invoice.id?


#11

Pietro G. wrote:

Il giorno 9 giugno 2009 9.38, jamba jambaremoved_email_address@domain.invalid ha scritto:

a questa soluzione c’ero gi� giunto, il problema e che come risultato
ottengo:

Couldn’t find Invoice with ID=36303630

ma quest’id � giusto? che tipo di campo �? non credo sia un serial, o
hai gi� generato trentasei milioni di fatture? � la chiave primaria
del record?

pietro

no solo 4/5 per prova.
la fattura la stampo tramite un link nella view in questo modo:

<%= link_to “PDF”, :controller => “invoices”, :action => “pdf”, :id =>
id %>


#12

Che action
�?Ci mostri il codice di quest’action?

l’action è questa:

def pdf
numero = Invoice.find(params[:id])
_pdf = PDF::Writer.new
_pdf.select_font “Times-Roman”
_pdf.text “prova”, :font_size => 20, :justification => :left
_pdf.line(50, 690, 560, 690).stroke

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

=> “application/pdf”
end


#13

Il giorno 9 giugno 2009 13.41, jamba jambaremoved_email_address@domain.invalid ha
scritto:

Che action
�?Ci mostri il codice di quest’action?

l’action è questa:

no, parlavo dell’action che poi viene seguita da una view che ti fa
comparire un link sulla pagina, quel link che poi clicchi per arrivare
all’action PDF.

pietro.


#14

Il giorno 9 giugno 2009 10.40, jamba jambaremoved_email_address@domain.invalid ha
scritto:

quasi ci siamo. ma oggetto_che_rappresenta:fattura_in_questione potrebbe
essere invoice (che sarebbe anche la tabella nel db) e quindi fare
invoice.id?

Non ci siamo.
Nella view non hai a disposizione altro che quello che viene definito
nel metodo del controller.

In genere, se l’action mostra un elenco di dati si definisce una
variabile (la convenzione è @invoices) che è una lista, mentre se si
mostra un singolo oggetto (fattura) la convenzione è @invoice.

Questa è una convenzione molto sensata, ma non è detto che tu la stia
seguendo.

Che action
è?Ci mostri il codice di quest’action?

pietro


#15

Pietro G. wrote:

Il giorno 9 giugno 2009 13.41, jamba jambaremoved_email_address@domain.invalid ha
scritto:

Che action
�?Ci mostri il codice di quest’action?

l’action è questa:

no, parlavo dell’action che poi viene seguita da una view che ti fa
comparire un link sulla pagina, quel link che poi clicchi per arrivare
all’action PDF.

pietro.

non ho capito molto ti posto tutta la view poi mi dici di cosa hai
bisogno…

<% form_for @invoice do |f| %>

Modifica Fattura
<h3>Fattura nº <%= @invoice.invoice_number %></h3>

<% unless @invoice.new_record? %>
<div class="<%= cycle('even', 'odd') %> pdf right">

questo è il link alla action pdf…

  <%= link_to "PDF", :controller => "invoices", :action => "pdf", 

:id => @invoice.id %>

</div>

<% end %>

<div class="<%= cycle('even', 'odd') %>">
  <label for="invoice_date">Data:</label>
  <%= f.date_select :date, :order => [:day, :month, :year] %>
</div>


<div class="<%= cycle('even', 'odd') %>">
    <label>Cliente:</label>
    <%= f.select :customer_id,
        @customers.map {|customer| [customer.name, customer.id]},
        {}, :class => "customer"
    %>
    <%= observe_field :invoice_customer_id,
       :url => select_customers_path,
       :update => "customer_info",
       :with => "id" %>
  </div>

<div  class="<%= cycle('even', 'odd') %>">
  <label for="invoice_iva">IVA:</label>
  <%= f.text_field :iva, :class => "textfield percent" %> %
  <%= error_for :invoice, :iva %>
</div>

<div  class="<%= cycle('even', 'odd') %>">
  <label for="invoice_rit">Ritenuta D'acconto:</label>
  <%= f.text_field :rit, :class => "textfield percent" %> %
  <%= error_for :invoice, :rit %>
</div>
Ritenuta professionale: <%= f.text_field :quattro, :class => "textfield percent" %> % <%= error_for :invoice, :quattro %>
<%= f.submit "Continua", :action => "update",:class => "button" %>
<% end %>

<% unless @invoice.new_record? %>

<%= render :partial => "/invoice_lines/invoice_lines" %>
<%= link_to "Elimina fattura", invoice_path(@invoice), :method => :delete, :confirm => "Sei sicuro?" %>
<% end %>

#16

jamba jamba wrote:

Che action
�?Ci mostri il codice di quest’action?

l’action è questa:

def pdf
numero = Invoice.find(params[:id])
_pdf = PDF::Writer.new
_pdf.select_font “Times-Roman”
_pdf.text “prova”, :font_size => 20, :justification => :left
_pdf.line(50, 690, 560, 690).stroke

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

=> “application/pdf”
end

non ho guardato dopo, cmq, se assegni a numero la tua Invoice, poi devi
usare quella di variabile…

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


#17

non ci siamo ancora. cerco di spiegare meglio la struttura della mia
app.
la tabella invoice, ha alcuni campi tra i quali number (che rappresenta
il numebro della fattura). chiaramente active record ha creato anche il
campo ID.

nella action pdf creo la variabile e le assegno il risultato di find
fatto sul campo ID. nella view inserisco un link_to legato all’action
pdf per generare il pdf. il problema è che non riesco a fare in modo che
il nome dle file sia il numero della fattura (non l’ID)…

Alessandro S. wrote:

jamba jamba wrote:

Che action
�?Ci mostri il codice di quest’action?

l’action è questa:

def pdf
numero = Invoice.find(params[:id])
_pdf = PDF::Writer.new
_pdf.select_font “Times-Roman”
_pdf.text “prova”, :font_size => 20, :justification => :left
_pdf.line(50, 690, 560, 690).stroke

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

=> “application/pdf”
end

non ho guardato dopo, cmq, se assegni a numero la tua Invoice, poi devi
usare quella di variabile…

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


#18

scusami, ma sto notando qualcosa di strano, nella action, usi questo:

numero = Invoice.find(params[:id])

quindi, “numero” è un’istanza di Invoice, una fattura registrata con un
determinato id

poco dopo, hai usato questo:

[SNIP] :filename => “#{invoice.number}.pdf”, [SNIP]

quindi se vuoi usare il numer odella fattura, dovresti usare questo:

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

spero che questa volta vada! =)
A.

jamba jamba ha scritto:


#19

Andrea P. wrote:

scusami, ma sto notando qualcosa di strano, nella action, usi questo:

numero = Invoice.find(params[:id])

quindi, “numero” è un’istanza di Invoice, una fattura registrata con un
determinato id

poco dopo, hai usato questo:

[SNIP] :filename => “#{invoice.number}.pdf”, [SNIP]

quindi se vuoi usare il numer odella fattura, dovresti usare questo:

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

spero che questa volta vada! =)
A.

jamba jamba ha scritto:

Grazie, quell’errore lo avevo già corretto nel frattempo. ora però cosa
metto nella view?

<%= link_to “PDF”, :controller => “invoices”, :action => “pdf”, :id =>
??? %>

se metto @number o @number.invoice_number o altro ottengo come
risultato:

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

quindi @number lo considerata nill…
mi sto perdendo…


#20

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: