从任务和模型中获取控制器操作响应

时间:2012-02-14 04:30:27

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1

我很乐意在模型中调用控制器动作。是的,MVC。感谢。

那么,为什么我要调用控制器动作并获取响应?

因为我的控制器知道如何渲染我想要缓存的文件。为什么要复制代码以收集我的视图所需的所有数据?

设定:

  • InvoicesController responds_to:html,:pdf
  • 发票使用state_machine(:new - >:open - > paid)

我需要什么"在州内过渡:从新到:开放

  • 生成 /invoices/:id.pdf
  • 将PDF缓存为Invoice#文件,以便以后在delayed_job或simliar中使用

我希望在其他地方使用哪种界面?

  • @invoice.build_pdf

有什么建议吗?

更新 我想将PDF缓存为模型附件供以后使用(delayed_job邮件等)

1 个答案:

答案 0 :(得分:0)

最好在控制器中使用您正在使用的代码来呈现PDF数据,并在lib目录中创建一个模块或类,让我们说lib/pdf.rb然后使用该代码您的控制器和您的模型。

更新:您可以将文件系统上的PDF本身缓存为一个文件,其中包含时间戳名称或类似名称的文件。然后向模型添加fileinvoice属性,以将该位置存储在数据库中供以后使用。

更新:您可以使用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

另一种方法是使用curlcurl http://localhost:3000/invoices/1.pdf来获取内容,然后存储输出。