在控制器中,我在其中一个操作中有以下行:
def some_action
@blog = Blog.find(11)
PdfSingleBlog.new(@blog).print
end
PDfSingleBlog
只是一个充当服务的PORO类。该服务的工作显然是生成该博客的pdf,并且应该将该pdf发送到用户的下载文件夹。该代码位于此处:
#app/services/pdf_single_blog.rb
class PdfSingleBlog
def initialize(blog)
@blog = blog
end
def print
pdf = Prawn::Document.new
pdf.text "Blog Name: #{@blog.name}"
pdf.text "Description: #{@blog.description}"
pdf.render_file "blog_info.pdf"
end
end
pdf已成功生成,但未将其发送到用户的下载文件夹。而是将其保存到服务器上的应用程序目录中。
如何将生成的pdf实际发送到用户的下载文件夹?
PDF of prawn manual found here
<小时/> 更新了以下答案:
def some_action
@blog = Blog.find(11)
blog_pdf = PdfSingleBlog.new(@blog).prepare_for_print
send_data blog_pdf.render, filename: "blog.pdf", type: "application/pdf"
end
#app/services/pdf_single_blog.rb
class PdfSingleBlog
attr_reader :blog
def initialize(blog)
@blog = blog
end
def prepare_for_print
pdf = Prawn::Document.new
pdf.text "Blog Name: #{@blog.name}"
pdf.text "Description: #{@blog.description}"
return pdf
end
end
答案 0 :(得分:2)
当您正在生成文件时,您实际上并未将其发送到浏览器。虽然您可以使用send_file
将本地生成的文件发送到浏览器,但这需要您生成文件并将其保存在本地。
由于这个文件是动态生成的,我建议使用send_data
来避免需要保存文件。
您可以通过进行以下修改来实现此目的
在您的控制器中:
def some_action
@blog = Blog.find(11)
send_data PdfSingleBlog.new(@blog).print_data, filename:'blog.pdf', type: "application/pdf", disposition: :attachment
end
在你的模特中:
class PdfSingleBlog
def print_data
pdf = Prawn::Document.new
pdf.text "Blog Name: #{@blog.name}"
pdf.text "Description: #{@blog.description}"
pdf.render
end
end
这会将pdf作为附件流式传输到浏览器,这将提示最终用户打开或下载文件。