我很乐意在模型中调用控制器动作。是的,MVC。感谢。
那么,为什么我要调用控制器动作并获取响应?
因为我的控制器知道如何渲染我想要缓存的文件。为什么要复制代码以收集我的视图所需的所有数据?
设定:
我需要什么"在州内过渡:从新到:开放
我希望在其他地方使用哪种界面?
@invoice.build_pdf
有什么建议吗?
更新 我想将PDF缓存为模型附件供以后使用(delayed_job邮件等)
答案 0 :(得分:0)
最好在控制器中使用您正在使用的代码来呈现PDF数据,并在lib
目录中创建一个模块或类,让我们说lib/pdf.rb
然后使用该代码您的控制器和您的模型。
更新:您可以将文件系统上的PDF本身缓存为一个文件,其中包含时间戳名称或类似名称的文件。然后向模型添加file
或invoice
属性,以将该位置存储在数据库中供以后使用。
更新:您可以使用respond_to
的阻止形式,如下所示:
respond_to do |format|
format.html
format.pdf { InvoiceBuilder.create(@invoice) }
end
更新:似乎ActionDispatch::Integration::Session
是用于集成测试的创建和界面的类。但我认为你可以将它用于你的目的。
您应该能够像这样使用它:
# app/models/invoice.rb
class Invoice < ActiveRecord::Base
def get_body
app = ActionDispatch::Integration::Session.new(Rails.application)
app.get("invoices/#{self.id}.pdf")
app.response.body # this returns the rendered content that the browser will see.
end
end
另一种方法是使用curl
即curl http://localhost:3000/invoices/1.pdf
来获取内容,然后存储输出。