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