前提・実装イメージ
- Rails5
- Whenever gem使用
- 特定できる固定のデータをゲストユーザーが持っている(今回はemailで特定します。)
ゲストログイン機能の実装は割愛します。
参考:簡単ログイン・ゲストログイン機能の実装方法(ポートフォリオ用)
各項目に参考にさせて頂いた記事を記載しながら進めていきます。
実装後の投稿のため、
抜けている、間違っている、補足等あればご教授いただけますと幸いです。
Whenever gemインストール
参考:Railsでwheneverを使ってcronを設定する
gem 'whenever', require: false
bundle install
初期化
下記コマンドでconfig直下にschedule.rbファイルが生成されます。
すでにgemインストール済でschedule.rbがある場合は不要です。
bundle exec wheneverize
後ほど、schedule.rbへの記述を行います。
ゲストユーザーの投稿を削除するメゾッドを作成
参考:find、find_by、whereの違い
参考:【Rails】destroy_allメソッドの使い方を徹底解説!
app/libの配下にdata_guest.rbを作成し、以下のように記述します。
find_byでゲストユーザーを特定し、destroy_allでその投稿を削除します。
※ゲストの特定条件や、削除する投稿のテーブル名は適用するものに変更してください。
ゲストユーザーが投稿したpostとcommentを削除する場合は下記の感じです。
class Guestuser::DataGuest
# guestuserの投稿を削除
def self.data_reset
user = User.find_by(email: "ゲストユーザーのemail")
user.tweets.destroy_all
user.comments.destroy_all
end
end
data_guest.rbへのpathsを設定
参考:Rails5のproduction環境でlib/配下のクラス読込みがNameErrorになるのはautoloadが無効化されたからだった
上で作成したdata_guest.rbが読み込まれるようconfig/application.rbへ下記1行を追加。
config.paths.add 'lib', eager_load: true
schedule.rbへの記述
data_guest.rbで定義したdata_resetメゾッドを定期的に実行する命令を
先ほど生成したschedule.rbへ記述します。
# Rails.rootを使用するために必要
require File.expand_path(File.dirname(__FILE__) + "/environment")
# cronを実行する環境変数
rails_env = ENV['RAILS_ENV'] || :development
# cronを実行する環境変数をセット
set :environment, rails_env
# cronのログの吐き出し場所
set :output, "#{Rails.root}/log/cron.log"
#30分に一度、data_resetメゾッドが実行される記述
#テストする際は下記を3.minuteとかに変えた方がいいかもしれません。
every 30.minute do
begin
runner "Guestuser::DataGuest.data_reset"
rescue => e
Rails.logger.error("aborted rails runner")
raise e
end
end
定期処理実行の確認
以下コマンドでschedule.rbの内容をcrontabに反映させます。
bundle exec whenever
bundle exec whenever --update-crontab
cronの起動
sudo systemctl start crond
# 止める際は下記
sudo systemctl stop crond
これで定期的にdata_resetメゾッドが実行されてゲストユーザーの投稿が削除されるはずです。
補足
ゲストログインをfind_or_create_byで実装した場合は、
毎度ユーザー自体を消すというやり方でも可能と思いますが、
ゲスト操作中に消えてしまう恐れがある点と、
消す投稿データを選べるという点でこちらで実装しました。
(postは消すが、いいねは消さない… 等)
同じ要領で、他の定期処理も増やしていけます。
なお、本番環境では、bundle exec whenever RAILS_ENV=productionを実行する前に、
export RAILS_ENV=productionを実行しなければ、
developmentの方に上書きされて反映できません。
結構ハマってしまったポイントですので参考記事を貼っておきます。
参考:【rails】production環境でバッチ処理の環境読み込みがdevelopmentになってしまうときの対処法