はじめに
Railsで「毎日ユーザーのポイントをリセットする」処理を rake
+ whenever
+ cron
で実装しようとしたところ、macOS + SQLite環境で思いがけないハマりポイントがいくつもありました。
この記事では、実際に遭遇したエラーとその解決策を、順を追って整理しています。
やりたいこと
- 全ユーザーの
points
を毎日15
にリセットしたい - SQLite を使っている開発環境(Mac)
-
rake
タスクをwhenever
で定期実行
手順とコード構成
1. Rakeタスクの作成
# lib/tasks/reset_points.rake
namespace :user do
desc "全ユーザーのポイントを15にリセットする"
task reset_points: :environment do
User.update_all(points: 15)
puts "[#{Time.now}] ポイントをリセットしました"
end
end
2. config/schedule.rb
の設定
# config/schedule.rb
set :output, "log/cron.log"
set :environment, "development"
env :PATH, ENV['PATH']
# zshログインシェル & プロジェクトディレクトリへ移動
set :job_template, "/bin/zsh -l -c 'cd /Users/jadikad/Development/backend && :job'"
# テスト用:毎分実行(本番では daily に)
every 1.minute do
rake "user:reset_points"
end
whenever --update-crontab
を実行して反映するのを忘れずに!
よくあるエラーとその解決法
❌ エラー1: bundler が見つからない
Could not find 'bundler' (2.3.27) required by your Gemfile.lock.
原因
cron は .zshrc
や .bash_profile
を読み込まないため、rbenv などの Ruby 環境が初期化されない。結果として、macOS のデフォルト Ruby(2.6など)が使われる。
解決策
schedule.rb
に以下を追加:
set :job_template, "/bin/zsh -l -c ':job'"
❌ エラー2: No database file specified
ArgumentError: No database file specified. Missing argument: database
原因
-
RAILS_ENV
が正しく指定されていない - SQLite の
.sqlite3
ファイルがdb/
ではなくstorage/
にある
解決策
-
schedule.rb
に以下を追加:
set :environment, "development"
-
config/database.yml
のパスを修正:
development:
adapter: sqlite3
database: storage/development.sqlite3
❌ エラー3: cronが正しいディレクトリで実行されない
原因
cron はプロジェクトのルートディレクトリでコマンドを実行しないため、相対パスの rake
や rails
コマンドが失敗する。
解決策
schedule.rb
に cd
を明示:
set :job_template, "/bin/zsh -l -c 'cd /Users/jadikad/Development/backend && :job'"
✅ 最終的な schedule.rb
set :output, "log/cron.log"
set :environment, "development"
env :PATH, ENV['PATH']
set :job_template, "/bin/zsh -l -c 'cd /Users/jadikad/Development/backend && :job'"
every 1.minute do
rake "user:reset_points"
end
🧪 動作確認方法
# cronに反映
$ whenever --update-crontab
# ログをリアルタイムで確認
$ tail -f log/cron.log