📖
【Rails】ゲストユーザーの投稿データ自動削除
ゲストユーザーが作成した投稿やコメントをログアウト時に自動的に削除する機能を付けたので忘れないうちに復習しておきます。
今回の条件
- 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モデルを使用して、ゲストユーザーが作成した投稿やコメントを削除するように設定しています。
-
User.find_or_create_by(email: User::GUEST_USER_EMAIL)
で、メールアドレスがUser::GUEST_USER_EMAIL
であるユーザーを取得。
User.find_or_create_by
User.find_or_create_byメソッドは、指定された属性を持つレコードが存在する場合はそのレコードを返し、存在しない場合は新しいレコードを作成する。
-
guest_user.reviews.destroy_all if guest_user.reviews.any?
で、ゲストユーザーが作成したレビューを削除します。any?
メソッドは、レビューが存在する場合にtrue
を返します。 -
guest_user.review_comments.destroy_all if guest_user.review_comments.any?
で、ゲストユーザーが作成したレビューコメントを削除します。any?
メソッドは、レビューコメントが存在する場合にtrue
を返します。 -
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::Base
:
private
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モデルを使用して、ゲストユーザーが作成した投稿やコメントを削除するように設定しています。
-
User.find_by(email: User::GUEST_USER_EMAIL)
で、メールアドレスがUser::GUEST_USER_EMAILであるユーザーを取得。 -
guest_user.reviews.destroy_all if guest_user.reviews.any?
で、ゲストユーザーが作成したレビューを削除します。any?
メソッドは、レビューが存在する場合にtrue
を返します。 -
guest_user.review_comments.destroy_all if guest_user.review_comments.any?
で、ゲストユーザーが作成したレビューコメントを削除します。any?
メソッドは、レビューコメントが存在する場合にtrue
を返します。 -
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等も使いながら調べて実装してみて機能として働いたのでおそらく大丈夫かとは思いますが、調べれば他にもシンプルなやり方が見つかるかもしれないので引き続き勉強していきます。(正直、使っているメソッドも初めましてばかりなので笑)
参考
Discussion
見ながらやったら実装できました!
本当にすごいです、全然エラーもでなくてさくさく進みます!
いつもありがとうございます!すごく助かってます。
スムーズすぎてタダで使わせてもらってるのが悪いくらいです…
ところどころ指摘いただいて完成したやつなんでエラーは乗り越えてきてます笑
自分の備忘録がお役に立てて嬉しいです😭
ありがとうございます!