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.

I'm Mark Thomas Miller, an engineer, designer, and maker of things.