【Rails】Deviseの基礎


初めに

Deviseはrailsを扱ったことがある人なら誰もが一度は実装するであろう有名なgemです。
しかし、機能自体は実装できたとしてもいまいちどこが動いて実装しているのかわからなかったり、いまいちどんな仕組みなのか掴めていない人も多いのではないでしょうか。
そこで今回はdeviseの基礎基本を自分なりに書いてみました。

主な機能

Deviseは主に10個のmoduleからなるgemです。
一つ一つのmoduleを組み合わせてみなさんが使っているようなDeviseの機能として機能します。
しかし、最初から全てが機能しているわけではなく、最初は一部のみ機能しています。

module名 機能
Database Authenticatable データベースに保存するパスワードを暗号化する
omniauthable facebookやtwetterなどを利用したログイン新規登録の機能を実装する際に使う(https://github.com/omniauth/omniauth)
confirmable サインインをした際に既にアカウントが登録されているかどうかを確認できる
recoverable ユーザーのパスワードをリセットできる
registerable 新規登録ができる機能。この機能を実装することにより、編集削除機能が使えるようになる
rememberable cookieを使用し、ユーザー情報を保持する
trackable サインイン回数・時刻・IPアドレスを保存する
timeoutable 指定された時間使用しなかったセッションを期限切れにする
validatable メールアドレスとパスワードにバリデーションをかける
lockable 指定された回数サインインを失敗するとアカウントをロックする

このmoduleを使用するかしないかの記述はuser.rbに記述します。(userの部分はdeviseに対応したファイル名)

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

devise: の後ろに続くものが指定されたmodule名です。

rails consoleでDevise.mappingsと打つと下記のような表示が出ますが、この中のmodulesというところに縦並びになっているものが機能しているmoduleとなります。

[1] pry(main)> Devise.mappings
=> {:user=>
  #<Devise::Mapping:0x00007fc1a1255ae8
 ~省略~
   @modules=
    [:database_authenticatable,
     :rememberable,
     :omniauthable,
     :recoverable,
     :registerable,
     :validatable],

ルーティング

普段Deviseを使う際にroutes.rbdevise_for :usersという記述をするかと思います。
このusersという部分はdevise内のコントローラで処理をする際に、スコープを設定するという処理をしており、ルートやuser_sign_in?などのメソッド名にも影響しています。
もしもcurrent_userなどのdeviseのメソッドを使いたいのであればdevise_forを設定する必要があります。

またルートをカスタマイズしたいとき、例えば/users/sign_inを/sign_inに変更したい場合はdevise_scopeを用います。

routes.rb
devise_scope :user do
  get 'sign_in', to: 'devise/sessions#new'
end

参考記事

https://github.com/plataformatec/devise#configuring-routes
https://qiita.com/ShinyaKato/items/a098a741a142616a753e

最後に

ごく断片的な記事になってしまいましたが一つでも参考になれれば幸いです。