如何从另一个Rails控制器访问方法

时间:2020-05-24 20:01:47

标签: ruby-on-rails

现在,我有一个名为Reports的控制器,并且在其中有一个名为generate_pdf的方法。当用户单击PDF图标时,它将路由到generate_pdf。效果很好。

但是,现在我正在运行一个后台任务,该任务需要从generate_pdf控制器访问Report中的相同代码。

我该怎么做?重定向将不起作用,因为它还是一个后台进程。我应该将此代码重定位到其他地方并从那里获取它,还是可以以某种方式调用Report控制器和过去的参数? generate_pdf的最终结果是将内容呈现到用户的Web浏览器,但是由于这是一项后台任务,因此我假设它将只是将内容返回给所谓的内容。

2 个答案:

答案 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