在涉及数据库访问的rails上的ruby中进行调度

时间:2012-12-07 13:28:28

标签: ruby-on-rails ruby scheduler rufus-scheduler

我想通过电子邮件安排每日报告给订阅用户。 为此我在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"}, ...


所以,我的问题是如何解决这个问题,或者在Windows和Linux上是否有适用于rails的备用调度程序?
我希望知道任何调度程序,它们可以帮助您发送从数据库中获取的报告。

2 个答案:

答案 0 :(得分: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任务也很方便进行测试。

答案 1 :(得分:0)

我同意claasz关于rake任务。看看每当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

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

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

希望这有帮助

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