Forum: Italian Ruby user group Problema banale con le variabili

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.
0cbd7cb62fdeba3bf69ac2e053dc9044?d=identicon&s=25 jamba jamba (jamba)
on 2009-06-08 17:59
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
Eda3d93f49a394d603bd5ecd7c821269?d=identicon&s=25 Andrea Pavoni (Guest)
on 2009-06-08 18:41
(Received via mailing list)
"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:
D716730ae3c9f3322f49d002192befc6?d=identicon&s=25 Alessandro Scolavino (ninjinka)
on 2009-06-08 21:03
Andrea Pavoni 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"
8768bcdbda1adf80e4da6744268868af?d=identicon&s=25 Pietro Giorgianni (giorgian)
on 2009-06-08 21:32
(Received via mailing list)
Il giorno 8 giugno 2009 21.03, Alessandro Scolavino<scolas@gmail.com>
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.
0cbd7cb62fdeba3bf69ac2e053dc9044?d=identicon&s=25 jamba jamba (jamba)
on 2009-06-09 08:58
Pietro Giorgianni wrote:
> Il giorno 8 giugno 2009 21.03, Alessandro Scolavino<scolas@gmail.com>
> 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
8768bcdbda1adf80e4da6744268868af?d=identicon&s=25 Pietro Giorgianni (giorgian)
on 2009-06-09 09:12
(Received via mailing list)
Il giorno 9 giugno 2009 8.58, jamba jamba<faletra@gmail.com> 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
0cbd7cb62fdeba3bf69ac2e053dc9044?d=identicon&s=25 jamba jamba (jamba)
on 2009-06-09 09:38
> 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
8768bcdbda1adf80e4da6744268868af?d=identicon&s=25 Pietro Giorgianni (giorgian)
on 2009-06-09 09:40
(Received via mailing list)
Il giorno 9 giugno 2009 9.38, jamba jamba<faletra@gmail.com> 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
0cbd7cb62fdeba3bf69ac2e053dc9044?d=identicon&s=25 jamba jamba (jamba)
on 2009-06-09 09:48
Pietro Giorgianni wrote:
> Il giorno 9 giugno 2009 9.38, jamba jamba<faletra@gmail.com> 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 %>
8768bcdbda1adf80e4da6744268868af?d=identicon&s=25 Pietro Giorgianni (giorgian)
on 2009-06-09 10:01
(Received via mailing list)
Il giorno 9 giugno 2009 9.48, jamba jamba<faletra@gmail.com> 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
0cbd7cb62fdeba3bf69ac2e053dc9044?d=identicon&s=25 jamba jamba (jamba)
on 2009-06-09 10:40
Pietro Giorgianni 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?
8768bcdbda1adf80e4da6744268868af?d=identicon&s=25 Pietro Giorgianni (giorgian)
on 2009-06-09 12:22
(Received via mailing list)
Il giorno 9 giugno 2009 10.40, jamba jamba<faletra@gmail.com> 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
0cbd7cb62fdeba3bf69ac2e053dc9044?d=identicon&s=25 jamba jamba (jamba)
on 2009-06-09 13:41
> 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
8768bcdbda1adf80e4da6744268868af?d=identicon&s=25 Pietro Giorgianni (giorgian)
on 2009-06-09 13:47
(Received via mailing list)
Il giorno 9 giugno 2009 13.41, jamba jamba<faletra@gmail.com> 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.
0cbd7cb62fdeba3bf69ac2e053dc9044?d=identicon&s=25 jamba jamba (jamba)
on 2009-06-09 15:01
Pietro Giorgianni wrote:
> Il giorno 9 giugno 2009 13.41, jamba jamba<faletra@gmail.com> 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| %>
  <fieldset>
    <legend>Modifica Fattura</legend>

    <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>

  <div  class="<%= cycle('even', 'odd') %>">
      <label for="invoice_quattro">Ritenuta professionale:</label>
      <%= f.text_field :quattro, :class => "textfield percent" %> %
      <%= error_for :invoice, :quattro %>
    </div>

  <div>
    <%= f.submit "Continua", :action => "update",:class => "button" %>
  </div>
  </fieldset>
<% end %>

<% unless @invoice.new_record? %>

<div id="invoice_lines_form">
  <%= render :partial => "/invoice_lines/invoice_lines" %>
</div>

<div class="<%= cycle('even', 'odd')%> delete_invoice">
    <%= link_to "Elimina fattura", invoice_path(@invoice), :method =>
:delete, :confirm => "Sei sicuro?" %>
</div>
<% end %>
D716730ae3c9f3322f49d002192befc6?d=identicon&s=25 Alessandro Scolavino (ninjinka)
on 2009-06-10 02:32
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"
0cbd7cb62fdeba3bf69ac2e053dc9044?d=identicon&s=25 jamba jamba (jamba)
on 2009-06-10 09:03
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 Scolavino 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"
Eda3d93f49a394d603bd5ecd7c821269?d=identicon&s=25 Andrea Pavoni (Guest)
on 2009-06-10 09:58
(Received via mailing list)
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:
0cbd7cb62fdeba3bf69ac2e053dc9044?d=identicon&s=25 jamba jamba (jamba)
on 2009-06-10 10:09
Andrea Pavoni 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...
Eda3d93f49a394d603bd5ecd7c821269?d=identicon&s=25 Andrea Pavoni (Guest)
on 2009-06-10 10:42
(Received via mailing list)
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:
0cbd7cb62fdeba3bf69ac2e053dc9044?d=identicon&s=25 jamba jamba (jamba)
on 2009-06-10 11:10
Andrea Pavoni 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=>???
Eda3d93f49a394d603bd5ecd7c821269?d=identicon&s=25 Andrea Pavoni (Guest)
on 2009-06-10 11:26
(Received via mailing list)
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:
0cbd7cb62fdeba3bf69ac2e053dc9044?d=identicon&s=25 jamba jamba (jamba)
on 2009-06-10 11:33
> in questo modo dovrebbe funzionare =P


Couldn't find Invoice with ID=pdf

sto gettando la spugna... :-(
Eda3d93f49a394d603bd5ecd7c821269?d=identicon&s=25 Andrea Pavoni (Guest)
on 2009-06-10 12:02
(Received via mailing list)
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:
0cbd7cb62fdeba3bf69ac2e053dc9044?d=identicon&s=25 jamba jamba (jamba)
on 2009-06-10 12:14
Andrea Pavoni 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
05720447a341aaffb8827039df3931df?d=identicon&s=25 Luca Mearelli (Guest)
on 2009-06-10 12:24
(Received via mailing list)
2009/6/10 jamba jamba <faletra@gmail.com>:

> 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
Eda3d93f49a394d603bd5ecd7c821269?d=identicon&s=25 Andrea Pavoni (Guest)
on 2009-06-10 12:31
(Received via mailing list)
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:
0cbd7cb62fdeba3bf69ac2e053dc9044?d=identicon&s=25 jamba jamba (jamba)
on 2009-06-10 14:42
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 Pavoni 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:
Eda3d93f49a394d603bd5ecd7c821269?d=identicon&s=25 Andrea Pavoni (Guest)
on 2009-06-10 16:14
(Received via mailing list)
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:
0cbd7cb62fdeba3bf69ac2e053dc9044?d=identicon&s=25 jamba jamba (jamba)
on 2009-06-10 16:47
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 Pavoni 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:
9538e63be1a8261e6c0e028db161a366?d=identicon&s=25 Andrea Longhi (andrea)
on 2009-06-11 00:50
>   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...
0cbd7cb62fdeba3bf69ac2e053dc9044?d=identicon&s=25 jamba jamba (jamba)
on 2009-06-11 08:45
> 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)
8768bcdbda1adf80e4da6744268868af?d=identicon&s=25 Pietro Giorgianni (giorgian)
on 2009-06-11 08:53
(Received via mailing list)
Il giorno 11 giugno 2009 8.45, jamba jamba<faletra@gmail.com> 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
05720447a341aaffb8827039df3931df?d=identicon&s=25 Luca Mearelli (Guest)
on 2009-06-11 08:55
(Received via mailing list)
2009/6/11 jamba jamba <faletra@gmail.com>:
>
>> 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( <id della fattura> )

dove <id della fattura> 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
0cbd7cb62fdeba3bf69ac2e053dc9044?d=identicon&s=25 jamba jamba (jamba)
on 2009-06-11 09:12
Luca Mearelli wrote:
> 2009/6/11 jamba jamba <faletra@gmail.com>:
>>
>>> 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( <id della fattura> )
>

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?
Eda3d93f49a394d603bd5ecd7c821269?d=identicon&s=25 Andrea Pavoni (Guest)
on 2009-06-11 09:26
(Received via mailing list)
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.
05720447a341aaffb8827039df3931df?d=identicon&s=25 Luca Mearelli (Guest)
on 2009-06-11 09:26
(Received via mailing list)
Non vorrei sembrare pedante, ma...

2009/6/11 jamba jamba <faletra@gmail.com>:
>
> 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 ;)

Luca
0cbd7cb62fdeba3bf69ac2e053dc9044?d=identicon&s=25 jamba jamba (jamba)
on 2009-06-11 10:17

che stupido....
This topic is locked and can not be replied to.