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'
Другие вопросы по тегам