Prawn - NoMethodError:私有方法`p'呼唤对象

时间:2015-01-28 17:29:19

标签: ruby-on-rails ruby-on-rails-3 pdf-generation prawn

我正在尝试生成一个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 个答案:

答案 0 :(得分: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)总是返回方法中最后一个语句的结果(至少在默认情况下是这样)。

修改

好的,我知道发生了什么。我个人会将initialize方法重命名为其他方法(比如说createPDF),因此它会返回prawn文档对象,而不是OrderPdfCreator对象。所以在你的控制器中你会有:

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