はじめに
ポートフォリオ(投稿アプリ)にユーザー退会機能を追加してみました。
今回は、アプリの性質上データ復元の必要性が低いため物理削除で実装し、ユーザーが退会したタイミングで、そのユーザーに紐づく投稿も削除する仕様にしました。
前提
・Ruby2.7.0
・Ruby on Rails6.0.3
・MySQL8.0
論理削除と物理削除
論理削除とは
・実際にはデータを削除しないが、ユーザーには削除しているかのような振る舞いを見せること。
・データベースに削除されたと見なすフラッグと呼ばれるカラムを設定。
・謝って削除したデータも復元可能。
・データ表示の際、where句で絞り込み検索を行うのに削除フラグの条件を追加する必要がある。
・データが増加し続け、データベースの容量の圧迫、パフォーマンス性の低下を起こす可能性がある。
物理削除とは
・データをDELETE(Railsだとdestroy)でデータベースから完全に削除すること。
・データは完全に削除され復元や参照が出来ない。
流れ
- コントローラ編集
- モデル編集
- ルーティング編集
- ビュー編集
コントローラ編集
users_controller.rb
に destroy
アクション追加。
class UsersController < ApplicationController
# before_action :set_user, :only => [:show, :favorites, :comments]
before_action :set_user, :only => [:show, :favorites, :comments, :destroy]
def destroy
@user = User.find(params[:id])
@user.destroy
flash[:notice] = 'ユーザーを削除しました。'
redirect_to :root #削除に成功すればrootページに戻る
end
private
def set_user
@user = User.find_by(:id => params[:id])
end
end
モデル編集
user.rb
に dependent => :destroy
を追加することで、退会したユーザに紐づく全投稿が削除される。
has_many :posts, :dependent => :destroy
# 退会ユーザーに紐づくお気に入りも削除する場合
has_many :favorites, :dependent => :destroy
# 退会ユーザーに紐づくコメントも削除する場合
has_many :comments, :dependent => :destroy
ルーティング編集
routes.rb
に destroy
アクション追加。
# resources :users, :only => [:show, :edit, :update]
resources :users, :only => [:show, :edit, :update, :destroy]
ビュー編集
マイページに退会ボタン作成。
"data-confirm" => "本当に退会しますか?"
で確認ダイアログも表示。
簡単ログイン機能でテストユーザーとしてログインした場合は、退会ボタンが表示されないようにする。
<% if user_signed_in? && @user == current_user %>
<% unless @user.email == "test@example.com" then %>
<div class="mt-3">
<%= link_to "退会",user_path(current_user.id), class: "destroy-user", method: :delete, "data-confirm" => "本当に退会しますか?" %>
</div>
<% end %>
<% end %>
このままだと、 post.user.name
みたいな記述をしているビューはエラーが出るので、 if文
追加。
<% @posts.each do |post| %>
<% if post.user %>
<% end %>
<% end %>
終わりに
以上でユーザー退会機能の実装完了。
退会ユーザーに紐づく投稿も無事削除できました。
今度は勉強も兼ねて論理削除での実装にもチャレンジしたいと思います!
初学者のため、理解不足な点が多々あると思います。気になった点やアドバイスなどありましたら、教えていただけますと幸いです!
参考サイト
・1分でわかる論理削除 -メリットとデメリットを考える-
・[削除機能の設計(物理削除とは/論理削除とは)]
(https://qiita.com/shukan0728/items/1a7b2db01ae25f8f7f88)
・論理削除と物理削除とは
・退会時に投稿データを削除する [Rails]
・Railsでユーザー退会機能をつくる
・【Rails 退会】railsで簡易的な退会機能を作る