1

我想通过电子邮件为订阅用户安排每日报告。
为此,我在 reports_controller 中编写了从数据库中获取数据并使用 pdfkit/wkhtmltopdf 将其转换为 pdf 的操作。
当从 get request 调用时,该操作可以正常工作。但是当转换为这样定义时

def self.dailymail
   ac = ActionController::Base.new()
   kit = PDFKit.new        #retrieve data from db  
   pdf = kit.to_pdf
   ReportMailer.send_reports(ac.send_data(pdf)).deliver
 end

与rufus调度程序一起使用时,它会在 send_data 调用中引发异常:

RackDelegation#content_type= delegated to @_response.content_type=, but @_response is nil: #<ActionController::Base:0x206b068 @_routes=nil, @_action_has_layout=true, @_headers={"Content-Type"=>"text/html"}, ...


所以,我的问题是我该如何解决这个问题,或者 Rails 中是否有任何替代调度程序在 Windows 和 Linux 上都可以正常工作?
我想知道任何有助于发送从数据库中获取的报告的调度程序。

4

2 回答 2

0

我同意 claasz 关于 rake 任务的观点。查看when gem https://github.com/javan/whenever Windows 任务计划程序不支持,但它确实支持创建 cron 作业。

查看文档以获取详细信息,但本质上,gem 会根据您在安装 gem 时创建的 schedule.rb 文件中的配置创建 cron 作业。

schedule.rb 的示例内容:

every 3.hours do
  runner "MyModel.some_process"
  rake "my:rake:task"
  command "/usr/bin/my_great_command"
end

这就像每 3 小时运行一次 bundle exec rake my:rake:task

创建 schedule.rb 后,您需要从控制台运行无论何时命令,以便将您的计划添加到 cron。如果您在没有参数的情况下运行,则输出会显示 schedule.rb 的内容。您需要提供一个论点,即我不记得了,只需通过 --help ,我认为您会得到答案。

希望这可以帮助

编辑:参数是 -w 写入 cron-tab

于 2012-12-07T20:07:06.097 回答
0

正如 willglynn 已经指出的那样,您应该摆脱任何控制器交互。这里根本没有必要,它使事情变得不必要地复杂。所以你的代码应该看起来更像

def self.dailymail
   kit = PDFKit.new        #retrieve data from db  
   pdf = kit.to_pdf
   ReportMailer.send_reports(pdf).deliver
end

如果您在使用 rufus 调度程序时遇到问题(我不知道),您可以创建一个rake任务来发送您的邮件并使用操作系统调度程序(例如 Linux 上的 cron)来调用该任务。拥有 rake 任务也便于测试。

于 2012-12-07T15:07:14.323 回答