I would like to schedule a daily task : every day at 7 AM, I want an email to be sent (without human intervention).
I\'m working on the RoR framework and I\'m wonder
Add a class method to one of your models that will handle this for you. Now try to execute that method using the runner script
./script/runner "MyModel.send_daily_mail" RAILS_ENV=production
Ensure everything works ok. If it does, then we need to make the command work universally by setting up the path to the project properly.
cd /path/to/my/rails/project && ./script/runner "MyModel.send_daily_mail" RAILS_ENV=production
Now change to any random directiry and run that command. If it runs properly, run crontab -e
and insert the command in there setup to run daily at 7AM. There are a ton of explanation about the cron format on there if you google for them and should be pretty simple to figure out.
BackgroundRB is what I use and it works perfect. I have several emails being sent, generated by BackgroundRB. I also have other tasks as well. Because it enables both scheduled tasks and asynchronous tasks (tasks that take longer than the normal client/server response cycle).
I use it and I am very happy with it.
Another option is to create a rake task that is run by a cron job.
To do this, create a file some_file.rake
and put it in your lib/tasks
folder. Your file might look like this:
Rails 2.x:
task :send_daily_mail, :needs => :environment do
Model.send_daily_mail
end
Rails 3.x:
task :send_daily_mail => :environment do
Model.send_daily_mail
end
Then use cron to execute it as often as you like:
cd /path/to/app && /usr/bin/rake send_daily_mail
Note you might need to put RAILS_ENV=production
in your crontab if your app is in development mode by default.
Go with a rake task and cron job, as the accepted answer already says. However, note that, updating the cron file itself is a manual task. That may be fine if you are not changing it during development. Otherwise, here how you can let Capistrano do it for you: http://push.cx/2008/deploying-crontab-with-your-rails-app
I was impressed by (and plan to try) the rufus-scheduler gem discussed in this blog post
He describes something like this:
scheduler = Rufus::Scheduler.start_new
scheduler.every("1m") do
DailyDigest.send_digest!
end
..which seems pretty simple. I wonder how easy it would be to add HTML-based configuration?