现在,我有一个名为Reports
的控制器,并且在其中有一个名为generate_pdf
的方法。当用户单击PDF图标时,它将路由到generate_pdf
。效果很好。
但是,现在我正在运行一个后台任务,该任务需要从generate_pdf
控制器访问Report
中的相同代码。
我该怎么做?重定向将不起作用,因为它还是一个后台进程。我应该将此代码重定位到其他地方并从那里获取它,还是可以以某种方式调用Report
控制器和过去的参数? generate_pdf
的最终结果是将内容呈现到用户的Web浏览器,但是由于这是一项后台任务,因此我假设它将只是将内容返回给所谓的内容。
答案 0 :(得分:3)
可能有两种方法可以做到这一点。但是一种方法是在诸如generate_pdf
之类的lib文件中定义lib/pdf_tools/generate_pdf.rb
。看起来像这样:
module PdfTools
def generate_pdf
...
end
... # Other methods that support generate_pdf if needed
end
然后创建一个文件config/initializers/pdf_tools.rb
,其中包含:
Dir.glob("#{Rails.root}/lib/pdf_tools/*.rb").each do |file_name|
require file_name
end
您可以按照自己的喜好以各种方式构造它。应用程序启动时,Rails将自动运行初始化程序。创建适当的初始化程序应确保将其包含在控制器和后台任务中。
答案 1 :(得分:1)
您应该避免尝试在后台作业或任何其他Rails类中使用控制器操作。 那不是一个好习惯。
我认为,解决此问题的一种可能方法是创建一个类ReportService
(或类似的东西)并在那里定义generate_pdf
方法。
此方法将包含应该在控制器和后台作业之间共享的通用代码。
例如,内容的呈现部分仍应仅在控制器中完成。
# app/services/report_service.rb
class ReportService
def generate_pdf
# Inside here should be the common logic for the PDF generation
# The result should in a suitable format in order to be able to be used by the controller and by the background job
end
end