Skip to content

Instantly share code, notes, and snippets.

@nilthacker
Last active May 13, 2020 23:59
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save nilthacker/1bb6301c363edc53e503 to your computer and use it in GitHub Desktop.
Save nilthacker/1bb6301c363edc53e503 to your computer and use it in GitHub Desktop.
Add Devise to Rails app

Devise Installation:

1. Create new rails application:

rails new app-name --database=postgresql -BT

  • --database=postgresql-> Use postgres for database
  • -B -> skip initial bundle install
  • -T -> skip test suite (we're using rspec)

2. Add basic controller:

rails g controller welcome

3. Add index view for welcome controller

Create: app/views/welcome/index.html.erb

4. Add Devise to Gemfile:

gem 'devise'

5. Run bundle:

bundle install

6. Install Devise:

rails g devise:install

7. Generate User model with Devise

rails g devise User

8. Review config/routes.rb

devise_for :users

9. Review Devise-generated model and enable desired features

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
end

10. Review Devise-generated migration and configure migration to mirror features enabled in User model

class DeviseCreateUsers < ActiveRecord::Migration
  def change
    create_table(:users) do |t|
      ## Database authenticatable
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""

      ## Recoverable
      t.string   :reset_password_token
      t.datetime :reset_password_sent_at

      ## Rememberable
      t.datetime :remember_created_at

      ## Trackable
      t.integer  :sign_in_count, default: 0, null: false
      t.datetime :current_sign_in_at
      t.datetime :last_sign_in_at
      t.inet     :current_sign_in_ip
      t.inet     :last_sign_in_ip

      ## Confirmable
      # t.string   :confirmation_token
      # t.datetime :confirmed_at
      # t.datetime :confirmation_sent_at
      # t.string   :unconfirmed_email # Only if using reconfirmable

      ## Lockable
      # t.integer  :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
      # t.string   :unlock_token # Only if unlock strategy is :email or :both
      # t.datetime :locked_at


      t.timestamps null: false
    end

    add_index :users, :email,                unique: true
    add_index :users, :reset_password_token, unique: true
    # add_index :users, :confirmation_token,   unique: true
    # add_index :users, :unlock_token,         unique: true
  end
end

11. Create database and run migrations

rake db:create

rake db:migrate

12. Configure URL options for Devise mailer in each environment:

  • In config/environments/development.rb: config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }

13. Verify root_path exists in config/routes.rb

root 'welcome#index'

14. Restart (or start) Rails server

15. What Devise provides:

  • All User CRUD views and controller actions
  • Helper functions:
    • current_user
    • user_session
    • user_signed_in?: Verify if a user is signed in

16. Customizing views:

rails g devise:views

17. Adding OAuth providers:

In breakout?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment