2015-01-28 1 views
0

Я пытаюсь создать pdf-файл, и по какой-то причине я продолжаю получать ошибку метода, когда пытаюсь сделать PDF. Буквально не знаю, что делать, поскольку все, что я пытаюсь в этот момент, - это сделать пустой pdf.Prawn - NoMethodError: частный метод `p ', вызываемый для объекта

NoMethodError: private method `p' called for #<OrderPdfCreator:0x007f9365053a20> 

OrderController

require 'order_pdf_creator' 

    def print_store_invoice 
    # print the store invoice... 
    @order = Order.find_by_id(params[:id]) 
    # create the pdf 
    pdf = OrderPdfCreator.new(@order) 

    render :attachment => pdf.p, :filename => "#{@order.id}.pdf", :layout => false 
    end 

OrderPdfCreator.rb

# encoding: UTF-8 
require 'open-uri' 

class OrderPdfCreator < BasePdfCreator 

    def initialize(order) 

    @pdf = Prawn::Document.new(:page_size => 'A4') 
    @pdf.font_size = 14 
    @order_pdf = order 

    file_path = File.join(Rails.root,'tmp',"#{@order_pdf.id}.pdf") 
    p = File.open(file_path, 'wb') { |f| f.puts @pdf.render } 

    end 

end 

BasePdfCreator.rb

# encoding: UTF-8 
class BasePdfCreator 

    private 

    def blank_line 
    @pdf.text ' ' 
    end 
end 

ответ

0

Ошибка говорит все. Вы вызываете метод, которого вы не должны. В частности, в этой строке:

render :attachment => pdf.p, :filename => "#{@order.id}.pdf", :layout => false 

изменить его на:

render :attachment => pdf, :filename => "#{@order.id}.pdf", :layout => false 

И в методе инициализации, изменения:

p = File.open(file_path, 'wb') { |f| f.puts @pdf.render } 

к:

@pdf 

Rails (хорошо , ruby) всегда возвращает результат последней sta tement в методе (по крайней мере, по умолчанию).

EDIT

Итак, я вижу, что происходит. Я лично переименовал бы метод initialize в нечто другое (скажем createPDF), поэтому он возвращает объект документа креветок, а не объект OrderPdfCreator. Поэтому в вашем контроллере у вас будет:

pdf = OrderPdfCreator.new 
pdf.createPDF 
send_data pdf.render, :type => 'application/pdf', disposition: 'inline' 
+0

ах да круто спасибо. пропустил это. Теперь он ищет шаблон 'print_store_invoice', и у меня есть его в местоположении, которое он ищет, но, похоже, не может его найти. Я также думаю, что говорить о том, чтобы сделать привязку и макет false, не позволит найти шаблон? – Robbo

+0

Когда я пользуюсь креветкой, мой звонок: 'send_data pdf, : type => 'application/pdf', расположение: 'inline''. 'Disposition: 'inline' 'гарантирует, что он отобразится в том же окне/вкладке, а не в новом всплывающем окне. –

+0

Отлично, это меня подобрало, но теперь, когда он пытается отобразить pdf, он говорит: «Не удалось загрузить pdf-документ». В журнале нет ошибок. – Robbo

Смежные вопросы