Prawn - NoMethodError: закрытый метод `p'вызывается для объекта
Я пытаюсь сгенерировать PDF, и по какой-то причине я продолжаю получать ошибку метода, когда я пытаюсь сделать PDF. Буквально не знаю, что делать, так как все, что я сейчас пытаюсь сделать, это сделать пустой PDF-файл.
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
1 ответ
Ошибка говорит обо всем. Вы вызываете метод, который вы не должны. Конкретно в этой строке:
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) всегда возвращает результат последнего оператора в методе (по крайней мере, по умолчанию).
РЕДАКТИРОВАТЬ
Хорошо, я вижу, что происходит. Я бы лично переименовал initialize
метод к чему-то другому (скажем, createPDF
), поэтому он возвращает объект документа креветки, а не OrderPdfCreator
объект. Так что в вашем контроллере вы бы имели:
pdf = OrderPdfCreator.new
pdf.createPDF
send_data pdf.render, :type => 'application/pdf', disposition: 'inline'