LoginSignup
6
10

More than 3 years have passed since last update.

【Rails】ユーザー退会機能(退会時に投稿データも削除)

Last updated at Posted at 2020-12-05

はじめに

ポートフォリオ(投稿アプリ)にユーザー退会機能を追加してみました。
今回は、アプリの性質上データ復元の必要性が低いため物理削除で実装し、ユーザーが退会したタイミングで、そのユーザーに紐づく投稿も削除する仕様にしました。

前提

・Ruby2.7.0
・Ruby on Rails6.0.3
・MySQL8.0

論理削除と物理削除

論理削除とは

・実際にはデータを削除しないが、ユーザーには削除しているかのような振る舞いを見せること。
・データベースに削除されたと見なすフラッグと呼ばれるカラムを設定。
・謝って削除したデータも復元可能。
・データ表示の際、where句で絞り込み検索を行うのに削除フラグの条件を追加する必要がある。
・データが増加し続け、データベースの容量の圧迫、パフォーマンス性の低下を起こす可能性がある。

物理削除とは

・データをDELETE(Railsだとdestroy)でデータベースから完全に削除すること。
・データは完全に削除され復元や参照が出来ない。

流れ

  1. コントローラ編集
  2. モデル編集
  3. ルーティング編集
  4. ビュー編集

コントローラ編集

users_controller.rbdestroyアクション追加。

users_controller.rb
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.rbdependent => :destroyを追加することで、退会したユーザに紐づく全投稿が削除される。

user.rb
has_many :posts, :dependent => :destroy
# 退会ユーザーに紐づくお気に入りも削除する場合
has_many :favorites, :dependent => :destroy
# 退会ユーザーに紐づくコメントも削除する場合
has_many :comments, :dependent => :destroy

ルーティング編集

routes.rbdestroyアクション追加。

routes.rb
# resources :users, :only => [:show, :edit, :update]
resources :users, :only => [:show, :edit, :update, :destroy]

ビュー編集

マイページに退会ボタン作成。
"data-confirm" => "本当に退会しますか?"で確認ダイアログも表示。
簡単ログイン機能でテストユーザーとしてログインした場合は、退会ボタンが表示されないようにする。

app/views/users/show.html.erb
<% 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文追加。

app/views/posts/index.html.erb
<% @posts.each do |post| %>
  <% if post.user %>
 <% end %>
<% end %>

終わりに

以上でユーザー退会機能の実装完了。
退会ユーザーに紐づく投稿も無事削除できました。
今度は勉強も兼ねて論理削除での実装にもチャレンジしたいと思います!

初学者のため、理解不足な点が多々あると思います。気になった点やアドバイスなどありましたら、教えていただけますと幸いです!

参考サイト

1分でわかる論理削除 -メリットとデメリットを考える-
削除機能の設計(物理削除とは/論理削除とは)
論理削除と物理削除とは
退会時に投稿データを削除する [Rails]
Railsでユーザー退会機能をつくる
【Rails 退会】railsで簡易的な退会機能を作る

6
10
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
6
10