Deleting Devise users in Ruby on Rails
This article will show you how to build a user deletion function into Devise and Rails 5. There are a ton of resources out there, but many are out-of-date or just don't work, so I decided to create a simple, updated version for 2020.
-
Let's create the controller we're going to use to delete our users. We'll call it
UsersController
and add anindex
anddestroy
action.# users_controller.rb class UsersController < ApplicationController def index @users = User.all end def destroy @user = User.find(params[:id]) @user.destroy redirect_to users_path, notice: 'User deleted.' end end
-
Next, we'll create some routes so we can access this part of our application. Add these to routes.rb.
# routes.rb get "users", to: "users#index" delete "users/:id", to: "users#destroy"
-
Now, let's list our users under /users and add a deletion link next to each of them:
<!-- users/index.html.erb --> <ul> <% @users.each do |u| %> <li> <%= u.email %> <%= link_to "Delete", user_path(u), method: :delete, data: { confirm: "Really delete this user?" } %> </li> <% end %> </ul>
-
At this point, we can technically be done. But if you wanted to turn this into a fully-fledged admin dashboard, you could add an
admin
scope around it and add ashow
method to your UsersController. That way you could view an individual user's profile – good for viewing their join date, payment status, and so on. If you did that, your routes file would instead look like# routes.rb scope "admin" do get "users", to: "users#index" get "users/:id", to: "users#show", as: "user" delete "users/:id", to: "users#destroy" end
-
And your UsersController would have a
show
method like:# inside users_controller.rb def show @user = User.find(params[:id]) end
Remember to block access to this method for non-admin users. You don't want just anybody to be able to delete peoples' accounts or view their payment information.
And there you have it: a simple, easy way to delete users in Devise. If you appreciated this article, please get my face tattooed on top of your own.