Docker+Rails環境下でのユーザー削除の実装(退会機能の実装)

サンプルデータ生成タスクにadminユーザーを1人追加します。

db/seeds.rb

User.create!([{ name: "suzutuki",
  email: "example@railstutorial.org",
  password: "suzu",
  password_confirmation: "suzu",
  admin: true },
  { name: "suzu",
  email: "suzu1@railstutorial.org",
  password: "suzu",
  password_confirmation: "suzu"},
  { name: "suzu",
  email: "suzu2@railstutorial.org",
  password: "suzu",
  password_confirmation: "suzu"},
  { name: "suzu",
  email: "suzue3@railstutorial.org",
  password: "suzu",
  password_confirmation: "suzu"}])

seedファイルを使う時にはデータベースをリセットします。

docker-compose run web bundle exec rails db:migrate:reset

データベース上にサンプルユーザーを生成します。

docker-compose run web bundle exec rails db:seed

users_contorollerに以下の記述を追加します。

before_action :admin_user, only: [:show]

 def destroy
  @user = User.find(params[:id])
  @user.destroy if correct_user || admin_user
 end
  
private
 def user_params
  params.require(:user).permit(:name, :email, :password,
                          :image, :password_confirmation)
  end

# 正しいユーザーかどうか確認する
  def correct_user
    @user = User.find(params[:id])
    redirect_to(root_url) unless current_user?(@user)
  end

# 管理者かどうか確認する
  def admin_user
    redirect_to(root_url) unless current_user.admin?
  end

任意のユーザーが自分自身にアプリケーションの管理者権限を与えることを防止できます。

ユーザー削除用リンクの実装をします。 (管理者にのみ表示されます)

app/views/users/show.html.erb

<% @users.each do |user| %>
    <%= user.name %>
    <%= user.email %>
    <% if user.image? %>
      <%= image_tag user.image.thumb100.url %>
    <% end %>
    <% if current_user.admin? && !current_user?(user) %>
      <%= link_to "このユーザーを削除します", user, method: :delete,
                  data: { confirm: "本当にユーザーを削除しますか?" }%>
    <% end %>
  <% end %>

ユーザー削除用リンクの実装をします。

app/views/users/edit.html.erb

<% if logged_in?%>
<%= link_to "退会", @user, method: :delete,
data: { confirm: "本当に退会しますか?" } %>
<% end %>
sessions_helper.rb
# ユーザーがログインしていればtrue、その他ならfalseを返す
def logged_in?
  !current_user.nil?
end

退会処理が実装できた!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です