Deleting Devise users in Rails 5+

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.

  1. Let’s create the controller we’re going to use to delete our users. We’ll call it UsersController and add an index and destroy 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
    
  2. 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"
    
  3. 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>
    
  4. 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 a show 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
    
  5. 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.