##はじめに
Railsのgemであるdeviseについて、導入からログイン機能の実装までの手順を紹介します。
##deviseとは
ユーザーの新規登録、ログイン、ログアウトなど、認証に必要な機能を追加することができるgemです。
##deviseのインストール
Gemfileにdeviseを追加
gem 'devise'
gemをインストールします。
$ bundle install
以下のコマンドで、関連ファイルをインストールします。
$ rails g devise:install
これにより、config/initializers/devise.rb、create config/locales/devise.en.ymlというファイルが作成されます。
##deviseの設定
まず、config/environments/development.rbに、以下のURLを追記します。
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
これは、ユーザーの新規登録などで使われる、認証メールに記載されるURLを設定しています。なので、メールによる認証を行わない場合はスキップして構いません。
また、エラーメッセージを表示させるために、app/views/layouts/application.html.erbに追記します。
<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>
これを、<%= yield %>の直前に追記します。
##ユーザーモデルの作成
認証用のユーザーモデルを作成するには、通常の「rails g model モデル名」ではなく、「rails g devise モデル名」を使います。
$ rails g devise user
作成されたユーザーモデルは、以下のとおりです。
class User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
end
この中に記載されているものは、モジュールと呼ばれるもので、それぞれ以下のような機能があります。
・database_authenticatable DBに保存されるパスワードが正しいかの検証と暗号化
・registerable サインアップ処理
・recoverable パスワードのリセット
・rememberable クッキーにログイン情報を保持
・trackable サインイン回数・時刻・IPアドレスを保存
・validatable メールアドレスとパスワードのバリデーション
・confirmable メール送信による登録確認
・lockable 一定回数ログインに失敗した際のアカウントロック
・timeoutable 一定時間でセッションを削除する
・omniauthable OmniAuthサポート
デフォルトでは、すべてのモジュールが設定されているわけではないので、必要に応じて追記しましょう。
また、作成されたマイグレーションファイルについても見ていきます。
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.string :current_sign_in_ip
t.string :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
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
モジュールを上のapp/models/user.rbで追加した場合、マイグレーションファイル内の対応する部分についても、コメントを外すようにしましょう。
モジュールの編集が終わったら、マイグレーションを実行し、テーブルを作成します。
$ rails db:migrate
この時点で、/users/sign_upにアクセスし、Sign upの画面が表示されれば無事成功です。
あとは、必要に応じて、ビューを編集していきましょう。
##ビューの作成
$ rails g devise:views
これにより、モデルに対応するいくつかのビューが作成されます。registrations/new.html.erb(新規登録画面)、sessions/new.html.erb(ログイン画面)、registrations/edit.html.erb(ユーザー編集画面)辺りはよく使うので、必要に応じてレイアウトを編集しましょう。
##コントローラの作成
コントローラを編集する場合、以下のコマンドを実行します。
$ rails g devise:controllers users
また、ルーティングの設定もしましょう。例えば、registrations_controller.rb、sessions_controller.rbを使う場合は以下のようにします。
devise_for :users, controllers: {
registrations: 'users/registrations',
sessions: 'users/sessions',
}
##参考サイト
https://qiita.com/ShinyaKato/items/a098a741a142616a753e