安排一个方法在Rails 3中每天运行一次

时间:2012-03-22 02:33:14

标签: ruby-on-rails-3

我有一种方法可以检查用户是否提交了上个月的时间表,如果没有,则会发送电子邮件提醒。这种方法需要每天运行。任何用户都没有动作实际触发此方法,它只是每天在设定的时间运行。

有关在Rails 3中实现此功能的最佳方法的任何想法吗?

4 个答案:

答案 0 :(得分:3)

创建一个rake任务来运行方法+发送电子邮件,并查看可以自动生成cron的gem。

https://github.com/javan/whenever

然后你可以使用以下内容在“config / schedule.rb”创建随时随地的配置文件;

every 1.day, :at => '12:00 pm' do
  rake "timesheet:check"                 
end

答案 1 :(得分:0)

您是否一定需要将此作为rails应用程序的一部分运行?是否可以将其作为自己的服务进行考虑?

如果您可以将此功能从rails应用程序中移出并自行运行,则只需编写ruby脚本并通过cron作业在预定时间执行该脚本。

当涉及到你的rails应用程序时,它可能会变得不必要地混乱,因为你需要一些东西来不断轮询时间,看看是否该时间调用该方法。对于像你这样的任务来说,cron工作总是更容易。

如果您能告诉我您正在使用的操作系统,我很乐意为您指出有助于您设置cron工作的资源。

答案 2 :(得分:0)

看看Resque Scheduler。您可以将cron设置为0 0 * * *,这将每天运行一次脚本。HereResque上的railscast。

答案 3 :(得分:0)

我正在Mac OS X上开发,我们的生产机器在CentOS上,但这也适用于Ubuntu。

我在report.rake中定义了一个rake任务

namespace :report do
  desc "Email stats"
  task :email_global_stats, [] => :environment do |t, args|
    StatsMailer.global_stats_email.deliver
  end
end

检查新统计数据然后通过电子邮件发送它的大部分逻辑都在StatsMailer中定义。然后在生产机器上,我在我的crontab中有这个(通过crontab -e访问):

30 7 * * * RAILS_ENV=production /usr/local/bin/rake -f /home/user/code/stats/current/Rakefile report:email_global_stats

它设置为早上7:30,这样我就没有一切都在午夜运行。然后我想在本地测试,我只是运行:

rake report:email_global_stats

来自我的开发目录。您还必须通过在Mac OS X上键入它来确保postfix正在运行:

sudo postfix start