📖

【Rails】ゲストユーザーの投稿データ自動削除

2023/11/22に公開2

ゲストユーザーが作成した投稿やコメントをログアウト時に自動的に削除する機能を付けたので忘れないうちに復習しておきます。

今回の条件

  • deviseを導入済み
  • ゲストログイン機能実装済み
  • レビュー投稿(review)レビューコメント(review_comment)掲示板投稿(post_board)の3点を削除するもの
  • 各投稿機能は作成済み(アソシエーション含め)

モデルへ記述

config/application.rb
:
:
config.after_initialize do
      guest_user = User.find_or_create_by(email: User::GUEST_USER_EMAIL)
      
      guest_user.reviews.each { |review| review.destroy } if guest_user.reviews.any?
      guest_user.review_comments.each { |comment| comment.destroy } if guest_user.review_comments.any?
      guest_user.post_boards.each { |board| board.destroy } if guest_user.post_boards.any?
    end
    :
    :

解説

after_initializeブロック内で、Userモデルを使用して、ゲストユーザーが作成した投稿やコメントを削除するように設定しています。

  1. User.find_or_create_by(email: User::GUEST_USER_EMAIL)で、メールアドレスがUser::GUEST_USER_EMAILであるユーザーを取得。
User.find_or_create_by

User.find_or_create_byメソッドは、指定された属性を持つレコードが存在する場合はそのレコードを返し、存在しない場合は新しいレコードを作成する。

  1. guest_user.reviews.destroy_all if guest_user.reviews.any?で、ゲストユーザーが作成したレビューを削除します。any?メソッドは、レビューが存在する場合にtrueを返します。
  2. guest_user.review_comments.destroy_all if guest_user.review_comments.any?で、ゲストユーザーが作成したレビューコメントを削除します。any?メソッドは、レビューコメントが存在する場合にtrueを返します。
  3. guest_user.post_boards.destroy_all if guest_user.post_boards.any?で、ゲストユーザーが作成した掲示板を削除します。any?メソッドは、掲示板が存在する場合にtrueを返します。

コントローラ記述

上記のモデルの記述だけでは、ログアウト時に投稿やコメントを削除するのではなく、アプリケーションが起動した際に実行されるようになります。

application_controller.rb

app/controllers/application_controller.rb
class ApplicationController < ActionController::Baseprivate

  def reset_guest_data
    guest_user = User.find_by(email: User::GUEST_USER_EMAIL)
    guest_user.reviews.destroy_all if guest_user.reviews.any?
    guest_user.review_comments.destroy_all if guest_user.review_comments.any?
    guest_user.post_boards.destroy_all if guest_user.post_boards.any?
  end
end

reset_guest_dataメソッドでは、Userモデルを使用して、ゲストユーザーが作成した投稿やコメントを削除するように設定しています。

  1. User.find_by(email: User::GUEST_USER_EMAIL)で、メールアドレスがUser::GUEST_USER_EMAILであるユーザーを取得。
  2. guest_user.reviews.destroy_all if guest_user.reviews.any?で、ゲストユーザーが作成したレビューを削除します。any?メソッドは、レビューが存在する場合にtrueを返します。
  3. guest_user.review_comments.destroy_all if guest_user.review_comments.any?で、ゲストユーザーが作成したレビューコメントを削除します。any?メソッドは、レビューコメントが存在する場合にtrueを返します。
  4. guest_user.post_boards.destroy_all if guest_user.post_boards.any?で、ゲストユーザーが作成した掲示板を削除します。any?メソッドは、掲示板が存在する場合にtrueを返します。

sessions_controller.rb

ここまでだとすべてのユーザーがログアウトした際にゲストユーザーの投稿が消えてしまうため下記の記述で絞ります。

app/controllers/public/sessions_controller.rb
:
def destroy
 reset_guest_data if current_user.email == User::GUEST_USER_EMAIL
 super
end
:

if文を使用し、ログアウトをしたのがゲストユーザーの場合だったらという形になります。

感想

こんな機能あったらいいなーでAI等も使いながら調べて実装してみて機能として働いたのでおそらく大丈夫かとは思いますが、調べれば他にもシンプルなやり方が見つかるかもしれないので引き続き勉強していきます。(正直、使っているメソッドも初めましてばかりなので笑)

参考

https://railsdoc.com/page/find_or_create_by

Discussion

けんぴよけんぴよ

見ながらやったら実装できました!
本当にすごいです、全然エラーもでなくてさくさく進みます!
いつもありがとうございます!すごく助かってます。
スムーズすぎてタダで使わせてもらってるのが悪いくらいです…

どぅーすーどぅーすー

ところどころ指摘いただいて完成したやつなんでエラーは乗り越えてきてます笑
自分の備忘録がお役に立てて嬉しいです😭
ありがとうございます!