5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Rails】Whenever gemを使って、ゲストユーザーの投稿を定期的に自動削除する

Posted at

前提・実装イメージ

  • Rails5
  • Whenever gem使用
  • 特定できる固定のデータをゲストユーザーが持っている(今回はemailで特定します。)

ゲストログイン機能の実装は割愛します。
参考:簡単ログイン・ゲストログイン機能の実装方法(ポートフォリオ用)

各項目に参考にさせて頂いた記事を記載しながら進めていきます。
実装後の投稿のため、
抜けている、間違っている、補足等あればご教授いただけますと幸いです。

Whenever gemインストール

参考:Railsでwheneverを使ってcronを設定する

Gemfile
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を削除する場合は下記の感じです。

app/lib/data_guest.rb
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/application.rb
config.paths.add 'lib', eager_load: true

schedule.rbへの記述

data_guest.rbで定義したdata_resetメゾッドを定期的に実行する命令を
先ほど生成したschedule.rbへ記述します。

config/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になってしまうときの対処法

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?