Ruby on rails 使用prawn生成pdf格式的表格
我已经在控制器内使用prawn pdf gem成功地生成了pdf文件,但是我想分离类文件并调用类的方法以使控制器代码看起来干净。 这是我的in-controller方法Ruby on rails 使用prawn生成pdf格式的表格,ruby-on-rails,ruby,ruby-on-rails-5,prawn,Ruby On Rails,Ruby,Ruby On Rails 5,Prawn,我已经在控制器内使用prawn pdf gem成功地生成了pdf文件,但是我想分离类文件并调用类的方法以使控制器代码看起来干净。 这是我的in-controller方法 def download_pdf if Subscriber.count<50 addSubscribers() else @subscribers=Subscriber.all.order("name ASC") end respond_to do |format| format.pdf do
def download_pdf
if Subscriber.count<50
addSubscribers()
else
@subscribers=Subscriber.all.order("name ASC")
end
respond_to do |format|
format.pdf do
pdf = Prawn::Document.new
table_data = Array.new
table_data << ["Name","E-mail","Phone"]
@subscribers.each do |p|
table_data << [p.name, p.email,p.phone]
end
pdf.table(table_data, :width => 500, :cell_style => { :inline_format => true })
send_data pdf.render, filename: 'test.pdf', type: 'application/pdf', :disposition => 'inline'
end
end
而PdfCreator类是->
class PdfCreator
def initialize(subscribers)
@subs=subscr
download_pdf()
end
def download_pdf()
pdf = Prawn::Document.new
table_data = Array.new
table_data << ["Name","E-mail","Phone"]
@subs.each do |p|
table_data << [p.name, p.email,p.phone]
end
pdf.table(table_data, :width => 500, :cell_style => { :inline_format => true })
send_data pdf.render, filename: 'test.pdf', type: 'application/pdf', :disposition => 'inline'
end
end
类PdfCreator
def初始化(订阅服务器)
@subs=subscr
下载(pdf)
结束
def下载(pdf)
pdf=对虾::Document.new
表_data=Array.new
表_数据{:内联_格式=>true})
send_data pdf.render,文件名:'test.pdf',键入:'application/pdf',:disposition=>'inline'
结束
结束
响应不是作为方法解析的。我发现了一些关于从外部类生成pdf的代码,但只针对普通文本而不是表格-关于如何为表格生成pdf的任何帮助,这将是一个很大的帮助
发送数据
是一种控制器级方法,在自定义类中不起作用,您的路线可能需要respond_to
,才能做出适当的响应
让我们尝试在控制器中保留所需内容,并仅将PDF生成逻辑提取到新的PdfCreator
类:
def download_pdf
@subscribers=Subscriber.all.order("name ASC")
respond_to do |format|
format.pdf do
pdf = PdfCreator.new(@subscribers)
send_data pdf.render, filename: 'test.pdf', type: 'application/pdf', disposition: 'inline'
end
end
end
class PdfCreator
def initialize(subscribers)
@subs=subscribers
end
def render()
pdf = Prawn::Document.new
table_data = Array.new
table_data << ["Name","E-mail","Phone"]
@subs.each do |p|
table_data << [p.name, p.email,p.phone]
end
pdf.table(table_data, :width => 500, :cell_style => { inline_format: true })
pdf.render
end
end
def下载\u pdf
@订阅者=订阅者.all.order(“名称ASC”)
回应待办事项|格式|
format.pdf do
pdf=PdfCreator.new(@subscribers)
发送数据pdf.render,文件名:'test.pdf',键入:'application/pdf',处置:'inline'
结束
结束
结束
类PdfCreator
def初始化(订阅服务器)
@subs=订阅者
结束
def render()
pdf=对虾::Document.new
表_data=Array.new
表_数据{inline_格式:true})
pdf.render
结束
结束
send\u data
是一种控制器级方法,在自定义类中不起作用,路由可能需要respond\u to
才能正确响应
让我们尝试在控制器中保留所需内容,并仅将PDF生成逻辑提取到新的PdfCreator
类:
def download_pdf
@subscribers=Subscriber.all.order("name ASC")
respond_to do |format|
format.pdf do
pdf = PdfCreator.new(@subscribers)
send_data pdf.render, filename: 'test.pdf', type: 'application/pdf', disposition: 'inline'
end
end
end
class PdfCreator
def initialize(subscribers)
@subs=subscribers
end
def render()
pdf = Prawn::Document.new
table_data = Array.new
table_data << ["Name","E-mail","Phone"]
@subs.each do |p|
table_data << [p.name, p.email,p.phone]
end
pdf.table(table_data, :width => 500, :cell_style => { inline_format: true })
pdf.render
end
end
def下载\u pdf
@订阅者=订阅者.all.order(“名称ASC”)
回应待办事项|格式|
format.pdf do
pdf=PdfCreator.new(@subscribers)
发送数据pdf.render,文件名:'test.pdf',键入:'application/pdf',处置:'inline'
结束
结束
结束
类PdfCreator
def初始化(订阅服务器)
@subs=订阅者
结束
def render()
pdf=对虾::Document.new
表_data=Array.new
表_数据{inline_格式:true})
pdf.render
结束
结束
您的实际错误是什么?我要注意的一点是,send\u data
将是该类中的一个问题,应该留在控制器中,但“代码显然是错误的”并不能真正帮助我们解决您可能遇到的任何其他问题。您的实际错误是什么?我要注意的一点是,send_data
将是该类中的一个问题,应该留在控制器中,但“代码显然是错误的”并不能真正帮助我们解决您可能遇到的任何其他问题。我尝试了这段代码,结果显示无法加载pdfdocument@Achy97很抱歉。我只是在本地创建了原型,并意识到我错过了在PdfCreator#render
中调用pdf.render
。我编辑了它来解决这个问题。嗨,@Unixmonkey我今天遇到了一个我以前没有注意到的问题。pdf正在成功生成,但问题是当内容远远超过一页时-然后只有第一页有表头,但下面的OAGE没有表头。你能帮我解决这个问题吗?@Achy97我想你可以通过header:true
到table
选项,它会像这样重复:pdf.table(table\u数据,宽度:500,单元格样式:{inline\u format:true},header:true)
hi,我尝试了这段代码,它显示加载pdf失败document@Achy97很抱歉。我只是在本地创建了原型,并意识到我错过了在PdfCreator#render
中调用pdf.render
。我编辑了它来解决这个问题。嗨,@Unixmonkey我今天遇到了一个我以前没有注意到的问题。pdf正在成功生成,但问题是当内容远远超过一页时-然后只有第一页有表头,但下面的OAGE没有表头。你能帮我解决这个问题吗?@Achy97我想你可以通过header:true
到table
选项,它将像这样重复:pdf.table(table\u数据,宽度:500,单元格样式:{inline\u格式:true},header:true)