Ruby: how to uninstall Devise?
I found daemonsy's reply to be very helpful. Here are a few other things to consider as you do this.
Replacing Devise
- If you are going to replace Devise with your own authentication, I recommend this Railscast: Authentication from Scratch (revised) (subscription required, but it's the best $9/mo you can spend).
- And this Railscast (no subscription required) can help with a forgot password link and "remember me" option (things Devise offers out of the box, but that you can build pretty easily yourself): Remember Me & Reset Password
Tests
- Before you do this, I recommend running all your tests to make sure they're passing.
- After you remove Devise, your authentication-dependent tests will probably fail, so plan to spend some time fixing failing tests. This is a good thing because it will help you see what stuff "broke" when you removed Devise.
- Make sure you check your test helpers as well. Most of my helpers were in /spec/spec_helper.rb. In fact, most of my failing tests began passing once I updated the methods in spec_helper.rb (eg, "login_user").
I'm looking at solving the same problem today and since this is not answered, giving it a go =)
Models
Devise generates a User
model if you installed by default.
Remove the lines under devise
. This is how mine looks like.
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
In attr_accessible
, you may remove email
, :password
, password_confirmation
and remember_me
if you no longer need them.
Views
A default Devise install doesn't generate views in your app
folder. If you generated overriding views for Devise, you may remove them by running rails destroy devise:views
(Rails 3).
Generally, all the views are stored in app/views/devise
.
Controllers
By default, Devise doesn't generate any controllers too. If you did any overrides, they are most likely known as registrations_controller
. Search your project for controllers that inherit Devise::RegistrationsController
class.
Also, if you followed Devise's wiki and monkey-ed around to add redirect methods etc, look out for methods such as after_sign_in_path_for
, store_location
etc that are for redirecting users.
Migrations
If you installed Devise via its generators, look out for a migration create_users
. If you don't need it anymore, use drop_table :users
in a migration to get rid of it.
I'll assume most people would want to keep their User model. If you're using Devise < 2.0, the migrations are done by helpers. Once you remove Devise from the Gemfile
, Rails will not understand the helpers below and throw errors, for instance, when you're trying to rerun these migrations on another box. These helpers are:
t.database_authenticatable
t.recoverable
t.rememberable
t.trackable
t.encryptable
t.confirmable
t.lockable
t.token_authenticatable # => becomes t.string :authentication_token
For the exact columns, the below is reference to the columns generated by Devise.
https://github.com/plataformatec/devise/wiki/How-To:-Upgrade-to-Devise-2.0-migration-schema-style
The guide above lists the fields generated by Devise using the helpers. You should be able to look through the list and your model (e.g. calling User
in console), generate a migration that removes those columns.
BUT...
It's a little unfortunate that for consistency, we have to convert the migration to not use helpers using the guide above then generate a migration to remove them. This is for migration history consistency, otherwise anyone running the migrations might try to call the non-existent helpers. Also, your migration to remove the fields will also expect the fields to be present.
Alternatively, it might be a good time to squash the migrations and rely on schema.rb
/ structure.sql
for the schema's to-date state. Even after deleting migrations, you can always recreate your development DB anytime using rake db:schema:load
.
Initializers and Locale
Remove devise.rb
in config/initializers
and devise.en.yml
in config/locales
.
Routes
Remove any devise_for
lines. These will raise errors after the removal of the gem.
Gem File
Yaay. All dome, remove the line gem 'devise'
from your gemfile.
Use the generator to remove configuration files as well (step 2), so the whole process would be (referencing previous answers):
- Remove the table:
rake db:rollback VERSION=<insert the version number of the migration>
- Remove the configuration:
rails destroy devise:install
- Remove your User model:
rails destroy devise User
(replace 'User' with the name of your model) - Remove references to devise in your routes.rb, gemfile, controller files, and view files like the following, if you used them (once again replacing 'user' with your model name):
- devise_for (routes.rb)
- gem 'devise' (gemfile)
- before_action :authenticate_user! (controllers)
- user_signed_in? (controllers, views)
- current_user (controllers, views)
- user_session (controllers, views)
In my case I had two models User and Admin and I am sticking with Devise, but I had a name collision issue with ActiveAdmin that requires me to remove the Admin model. But because there were so many references to Admin in devise, I had to take the steps below. I think it answers the original question above as well, though. I believe the correct way to do this is:
1.Find the devise migration for the user model and roll it back [IMPORTANT: IF you DON'T want to remove the user table associated with Devise, then SKIP THIS STEP]:
rake db:rollback VERSION=<insert the version number of the migration>
example:
rake db:rollback VERSION:20110430031806
2.Run this command to remove Devise and associated files.
rails destroy devise Admin
(if Admin is the name of the model with user accounts).
This produces this output:
invoke active_record
remove db/migrate/20110430031806_devise_create_admins.rb
remove app/models/admin.rb
invoke test_unit
remove test/unit/admin_test.rb
remove test/fixtures/admins.yml
route devise_for :admins
3.To completely remove Devise, you need to remove all references to it in your models, controllers and views. This is manual work. The answer above provides good details for finding this cruft, but was incomplete for my purposes. I hope this helps someone else.