Rails:如何从控制器创建文件并将其保存在服务器中?

时间:2011-09-28 19:15:01

标签: ruby-on-rails file

由于某些奇怪的原因,我需要在服务器中保存文件(通常直接下载)。在我的情况下,我有一个PDF文件用PDFKit创建,我需要保留。

# app/controllers/reports_controller.rb
def show
  @report = Report.find(params[:id])

  respond_to do |format|
    format.pdf { render :text => PDFKit.new(report_url(@report)).to_pdf }
  end
end

如果我去报告/ 1.pdf我得到了我期待的报告,但我想把它保存在服务器中。

是否有一种Raily的方式来保存服务器中的文件以响应?

1 个答案:

答案 0 :(得分:2)

在我得到实际答案之前,请快速注意:看起来您将完全限定的网址report_url(@report))传递给PDFKit.new,这是一种浪费 - 这意味着PDFKit必须向Web服务器发出请求,而Web服务器又需要通过Rails的路由器等等,以获取页面内容。相反,您应该使用render_to_string在控制器中呈现页面并将其传递给PDFKit.new,因为它将接受HTML字符串。牢记这一点......

PDFKit's README的“使用情况”部分对此进行了介绍。你会做这样的事情:

def show
  @report = Report.find(params[:id])

  kit       = PDFKit.new render_to_string(@report) # pass any options that the
  pdf_file  = kit.to_file '/some/file/path.pdf'    # renderer needs here (same
                                                   # options as `render`).
  # and if you still want to send it to the browser...
  respond_to do |format|
    format.pdf { render :file => pdf_file.path }
  end
end