【Rails】deviseの使い方を徹底解説!

Rails

deviseとは

railsのgemの一つでログイン認証機能を簡単に実装することができます。

ログイン認証ってなに?
リンクをコピーしました

ログイン認証とは簡単にいうとログイン、ログアウト機能のことです。
ログインするにはまずサインアップ(新規登録)をする必要があるので、ユーザー登録も必要になります。
これを自分で実装しようとすると非常に大変です。
ですがdeviseというgemを使えば簡単に実装することができます。

gemをインストールしよう
リンクをコピーしました

それではrailsのアプリにdeviseをインストールしてみましょう。
Gemfileの一番下にこのように記述してください。

ruby
1
gem 'devise'

その後、ターミナルで「bundle install」を行いましょう。
次にターミナルで下記のコマンドを実行してください。

shell
1
$ rails g devise:install

以下のようにターミナルに出力されればインストールに成功しています。

deviseインストール
ここで出力されるメッセージの内容を確認してみましょう。

1. 新規登録などで認証メールを送った際、メールの文中にある認証リンクのURLを設定します。
設定するファイルは「config/environments/development.rb」です。
出力された内容にある通り下記のように設定します。

ruby
1
config.action_mailer.default_url_options = { protocol: 'https', host: 'トップページアドレス' }

デフォルトだと{ host: 'localhost', port: 3000 }になっています。

2. ルートを設定します。
deviseだと会員登録完了後などにルートに飛ぶ設定になっているため、あらかじめ「config/routes.rb」でルートを設定する必要があります。

3. フラッシュメッセージ用のタグをビューに埋め込みます。

erb
1
2
<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>

これはflashメッセージというもので、それぞれ「notice」,「alert」という変数に格納されています。
ログインした際やログアウトした際、フォームの送信エラーなど簡単な通知をしたい場合に使用します。
フラッシュメッセージを表示させたい時はこのコードを共通のビューである「app/views/layouts/application.html.erb」に追記します。

4. deviseのビューをカスタマイズする時は下記のコマンドを実行します。

shell
1
$ rails g devise:views

deviseでは認証周りのビューファイルは最初から用意されています。
しかしデフォルトのビューは非常に簡素なので、自分でカスタマイズする際にはこのコマンドを使い、ビューファイルを作成し、作成されたファイルを編集します。

deviseを使ってユーザーモデルを作ろう
リンクをコピーしました

認証が使えるモデルを作成する際には通常のモデルを作成するコマンドである「rails g model モデル名」ではなく、「rails g devise モデル名」というコマンドを使います。

userというモデルを作成する際は下記のコマンドになります。

shell
1
$ rails g devise user

このコマンドでモデルを作成するとログイン認証をするためのファイルが自動で作成され、認証機能を使えるようになります。
それと同時にroutes.rbに「devise_for :users」が追記されます。
この記述により下記のようにサインアップや、ログインなど認証のためのルーティングが自動で作成されます。

サインアップ

devise_for :モデル名
リンクをコピーしました

「devise_for」はdeviseのヘルパーメソッドです。
「:モデル名」を指定すると認証に必要なルーティングを自動で設定してくれます。
この記述の追加と同時にマイグレーションファイルも作成されます。

deviseで定義されているモジュールを確認しよう
リンクをコピーしました

マイグレーションファイルを確認するとdeviseで定義されたモジュールの設定が書かれています。
それぞれのモジュールがどういう機能を持つのか確認しておきましょう。

Database authenticatable
リンクをコピーしました

データベースに保存されたパスワードが正しいか検証をします。
同時にパスワードの暗号化も行います。

Recoverable
リンクをコピーしました

パスワードをリセットします。

Trackable
リンクをコピーしました

ログインした回数、最終ログイン日時、前回ログイン日時、最終ログインIP、前回ログインIPを保存します。

Confirmable
リンクをコピーしました

新規登録時にメール認証機能をつけます。

Lockable
リンクをコピーしました

ログインに何度も失敗すると、アカウントをロックします。
何回失敗するとロックするかはこのLockable内で指定します。

以上がマイグレーションファイルに設定されています。
初期状態だとコメントアウトされているものもあるので、使いたい場合はコメントアウトを外しておきましょう。

その他に用意されているモジュール
リンクをコピーしました

マイグレーションファイルに記述されている以外にもモジュールが用意されています。

Timeoutable
リンクをコピーしました

ログインしたままの状態で一定時間経つと自動でログアウトさせます。
デフォルトだと30分になっています。
有効期限を自身で設定したい場合は「config/initializers/devise.rb」に下記を追記します。

ruby
1
2
# 1ヶ月と指定
config.timeout_in = 1.month

次にrailsの有効期限を設定します。
「config/initializers/session_store.rb」を下記のように編集します。

ruby
1
TechReviewSite::Application.config.session_store :cookie_store, key: '自分のアプリの設定_session', expire_after: 1.month'

こうすることにより1ヶ月はログインセッションが保持され、1ヶ月以内にアクセスすればさらに1ヶ月セッション時間が保持されます。

Validatable
リンクをコピーしました

Emailやパスワードのバリデーションを追加します。

Omniauthable
リンクをコピーしました

twitterやFacebookなどのSNS認証を追加します。

モジュールの使い方
リンクをコピーしました

これらのモジュールを使いたい場合は「app/models/users.rb」で下記のように指定します。

ruby
1
2
devise :database_authenticatable, :registerable,
       :recoverable, :rememberable, :validatable

上の指定だと5つのモジュールが使えます。
使いたいモジュールを追記すれば使用可能になります。

deviseのヘルパーメソッド
リンクをコピーしました

deviseでは便利なヘルパーメソッドがたくさん用意されています。
主なものを確認しておきましょう。
※「user」の部分はモデル名になるので、「rails g devise teacher」でteacherモデルを作成している時は「teacher」などに置き換えてください。

current_user
リンクをコピーしました

現在ログインしているユーザーのレコードを取得できます。

現在ログインしているユーザーのidを取得する際は「current_user.id」で取得できます。

user_signed_in?
リンクをコピーしました

ユーザーがサインしていればtrueが、サインアウトしていればflaseが返ってくるメソッドです。
ビューでcurrrent_userを使う際、ログインしていない場合、エラーになってしまうので、このメソッドで条件分岐をする必要があります。

authenticate_user!
リンクをコピーしました

「before_action :authenticate_user!」みたいにbefore_actionと併用して使います。
この一文をコントローラーの最初に記述しておくことにより、ユーザがログインしていない場合はログインページにリダイレクトさせます。
投稿はログインしていないとできないようにする際などに使用します。
「only」や「except」でアクションを設定することが多いです。

configure_permitted_parameters
リンクをコピーしました

作成したモデルにストロングパラメーターを追加したい場合に使用します。
デフォルトだとメールアドレスとパスワードのみストロングパラメーターがかかっています。

使用する際は「application_controller」にbefore_actionを使って記述します。

ruby
1
2
3
4
5
6
7
before_action :configure_permitted_parameters, if: :devise_controller?

#新規登録時のストロングパラメータに「nicknameカラム」の追加
def configure_permitted_parameters
    #新規登録時のストロングパラメータに「nicknameカラムとageカラム」の追加
    devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname, :age])
end

第一引数は下記のように指定できます。

  • sign_up: 新規登録時
  • sign_in: ログイン時
  • account_update: 更新時

deviseを日本語化しよう
リンクをコピーしました

デフォルト状態だとフラッシュメッセージなどが英語なので日本語に変更しましょう。
公式サイトにもやり方が載っています。
まずは「config/application.rb」に下記のコードを追記します。

ruby
1
config.i18n.default_locale = :ja

次に「config/locales」フォルダ内に「devise.ja.yml」というファイルを作成します。
作成したファイルに公式サイトに掲載されている内容をコピーします。

もう一つ「config/locales」フォルダ内に「ja.yml」というファイルを作成します。

作成したファイルに公式サイトに掲載されている内容をコピーします。

これで日本語化は完了です。

ビューを変更しよう
リンクをコピーしました

投稿フォームのデザインはdeviseで用意されています。
ただシンプルなので自分のアプリに合ったデザインに変更するのが良いでしょう。
その際は下記のコマンドを入力します。

shell
1
$ rails g devise:views

するとviewsフォルダに「devise」が作成されます。

viewsの作り方
各フォルダがどのビューに対応しているか確認してみましょう。

フォルダ名 ファイル名 内容
confirmations new パスワード再発行時のフォーム
mailer 後述 送信されるメールの内容(下記に詳細)
passwords edit パスワード編集フォーム
passwords new パスワードを忘れた時のフォーム
registrations edit ユーザー情報編集フォーム
registrations new 新規登録のフォーム
sessions new ログインフォーム
shared _link 各フォームに表示されるリンクの部分テンプレート
unlocks new アカウントロック通知メールを送信するフォーム

フラッシュメッセージが表示されるようにしよう
リンクをコピーしました

フラッシュメッセージはログインした際や、何らかのエラーメッセージを簡易的に表示させるものです。
deviseでは自動的にフラッシュメッセージを表示してくれます。
そのための設定を行いましょう。

いろんなページで使うので部分テンプレートとして作成します。

erb
1
2
3
4
5
6
<% if notice %>
  <p><%= notice %></p>
<% end %>
<% if alert %>
   <p><%= alert %></p>
<% end %>

フラッシュメッセージには「notice」と「alert」の2種類があり、「notice」はログインに成功した時とか、投稿に成功した時など動作が正常に動いた時などに表示されます。
それに対し「alert」は動作が失敗したりエラーが出た時に表示されます。
pタグにそれぞれスタイルを設定しておくと良いでしょう。

この部分テンプレートをフラッシュメッセージを表示させたい箇所で呼び出します。

メール認証機能をつけよう
リンクをコピーしました

deviseを使うとユーザー登録の時にメール認証機能をつけることができます。
メール認証は何かというとユーザー登録をした後、登録したメールアドレスにメールを送り、そのメール内にあるリンクをクリックするとユーザー登録が完了するという機能です。
実装するまでに手順を確認しておきましょう。

ユーザーモデルを編集しよう
リンクをコピーしました

メール認証機能を使うには上の説明でもあったようにdeviseで用意されているモジュールを使用します。
下記のようにuser.rbに「:confirmable」を追記します。

ruby
1
2
devise :database_authenticatable, :registerable,
       :recoverable, :rememberable, :trackable, :validatable, :confirmable

メール送信用サーバーの設定をしよう
リンクをコピーしました

次にメール送信用サーバーの設定をします。
「config/environments/development.rb」に下記のコードを追加します。

ruby
1
2
3
4
5
6
7
8
9
10
11
12
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
config.action_mailer.raise_delivery_errors = true
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
  :enable_starttls_auto => true,
  :address => "smtp.gmail.com",
  :port => 587,
  :domain => 'smtp.gmail.com',
  :user_name => "メールアドレス",
  :password => "パスワード",
  :authentication => 'login'
}

メールアドレスにはgmailでないとダメみたいなので、gmailで設定してください。
パスワードの部分はgmailのログインパスワードです。
もし二段階認証をしている場合はアプリパスワードというのを取得しなくてはなりません。

アプリパスワード
リンクをコピーしました

二段階認証をしている場合、その都度パスワードが変わるのでここでは直接記述することができません。
ですので二段階認証時のパスワードとは別にアプリパスワードというのを使用します。
アプリパスワードは下記の順番で取得することができます。

1. googleアカウントページへ行く。

2. セキュリティをクリックする。

セキリュティ

  1. 2段階認証プロセスがオンになっているのを確認し、アプリパスワードをクリックする。

アプリパスワード
4. 本人認証後、下の画面になるので、「その他(名前を入力)」を選択し、自分のアプリ名を入力する。

自分のアプリ名
5. アプリパスワードが生成されるので、コピーをする。

アプリパスワード
これでアプリ生成パスワードが確認できました。
このパスワードを上のdevelopment.rbに記述しましょう。

devise.rbを編集しよう
リンクをコピーしました

次に「config/initialiezers/devise.rb」を編集します。
下記のコードを追記してください。

ruby
1
config.mailer_sender = 'アプリで使用するgmailアドレス'

これでメール認証の設定は完了です。

届くメールの内容を編集しよう
リンクをコピーしました

メール認証機能を実装するとユーザー登録やパスワードを変更する時にメールを送ることができるようになります。
デフォルトだとdeviseが作成した英語の内容になっているので、自分のアプリに応じて内容を差し替えます。
編集するファイルは「app/views/devise/mailer」の中にあるファイルです。

メール設定
各ファイルがどの時に送られるメールなのかを確認してみましょう。

ファイル名 送られる時
confirmation_instructions.html.erb ユーザー登録をした時
password_change.html.erb パスワード変更が完了した時
reset_password_instructions.html.erb パスワードを忘れた時
unlock_instructions.html.erb アカウントがロックされた時
まとめ

deviseは認証機能を簡単に実装できるとても便利なGemです。