我想通过电子邮件安排每日报告给订阅用户。
为此我在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的备用调度程序?
我希望知道任何调度程序,它们可以帮助您发送从数据库中获取的报告。
答案 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