ユーザー管理機能のためのdevise導入手順
はじめに
deviseとは、ユーザー管理機能を簡単に実装するためのGemです。
実際に運用されているRailsアプリケーションサービスで使用されているそうです。
本記事の目次は以下のとおりです。
- deviseのインストール
- Userモデルとテーブルの作成
- ビューファイルの作成
- ストロングパラメーターの設定(カラムを追加した場合)
- ログインの有無でビューの表示を変える場合
deviseのインストール
既存のrailsアプリににdeviseライブラリをインストールします。
Gemfileの最後の行に追記しましょう。
gem 'devise'
インストールするアプリのディレクトリで以下コマンドを実行します。
% bundle install
次に、devise専用のコマンドで設定ファイルを作成します。
% rails g devise:install
Userモデルとテーブルの作成
ユーザー情報を管理するためのUserモデルを新しく作成する必要がありますが、rails g model user
ではなく、deviseのモデル作成用コマンドで作成します。
ターミナルで以下を実行しましょう。
% rails g devise user
実行すると、モデル・マイグレーションも自動生成されます。
さらに、ルーティングも自動生成されていますので確認しましょう。
Rails.application.routes.draw do
+ devise_for :users
root to: 'homes#index'
resources :homes
end
このとき、追記されたdevise_for :users
の位置はこのまま最上位にしておく必要があります。
また、このdevise_for
は、ユーザー機能に必要な複数のルーティングを一度に生成してくれています。
次に自動生成されたマイグレーションファイルを確認します。
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: ""
# 省略
end
end
end
上記の通り、メールアドレスとパスワードについては初期状態で既に記述済みです。
ちなみに、ビューで自身が入力するときはpassword
とpassword_confirmation
というキーを使用しますが、データベースに保存される前に、deviseが2つの情報を照合します。また、一致していればパスワードそのものを暗号化してくれる仕組みになっています。
その暗号化された後のパスワードがencrypted_password
です。
メールアドレスとパスワード以外のカラムの追加をする場合は、ここで追加しても良いし、後から追加してもどちらでも大丈夫です。
ここではこのままテーブルを作成します。
% rails db:migrate
これでusersテーブルが作成されました。
ビューファイルの作成
deviseを使用してログイン機能を実装すると、自動的にログイン画面とサインアップ(新規登録)画面が生成されます。
しかし、ビューファイルとしては生成されていませんので、deviseのコマンドを使用してビューファイルを生成します。
% rails g devise:views
app/views
の配下にdeviseディレクトリが生成されました。
必要に応じて、デフォルトのビューを変更・差し替えします。
ファイル名や配置するディレクトリ名は変更しないよう注意しましょう。
デフォルトのログインの画面
ストロングパラメーターの設定(カラムを追加した場合)
deviseを使わない通常のリクエストは、コントローラーにストロングパラメーターを記述します。
しかし、deviseの処理を行うコントローラーはGem内に記述されており、編集することができません。
そこで、すべてのコントローラーが継承しているapplication_controller.rb
ファイルにdeviseに関するストロングパラメーターを定義します。
class ApplicationController < ActionController::Base
before_action :configure_permitted_parameters, if: :devise_controller?
private
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname])
end
end
上記コードの説明
-
2行目
before_action :configure_permitted_parameters, if: :devise_controller?
before_action
のif
オプションを設定することで、if
以下の戻り値がtrueであったときのみ、処理が執行されます。
:devise_controller?
というdeviseのヘルパーメソッドを指定し、deviseに関するコントローラーの処理であれば、configure_permitted_parameters
メソッドを実行するようにします。 -
6行目
devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname])
devise_parameter_sanitize
メソッドをプライベートメソッドの中で定義しました。
deviseの提供元でこのとおり紹介されていることから、慣習的にこのメソッド名で定義することが多いようです。
ここで引数に注目しましょう。
# paramsのpermitメソッド
params.require(:モデル名).permit(:許可するキー)
# devise_parameter_sanitizerのpermitメソッド
devise_parameter_sanitizer.permit(:deviseの処理名, keys: [:許可するキー])
- 第一引数の処理名には
sign_in
、sign_up
、account_update
が使用でき、それぞれサインイン時やサインアップ時、アカウント情報更新時の処理に対応しています。 - 第二引数には初期から設定されているメールアドレスとパスワード以外に設定したカラムがあれば、そのkeyの取得を許可します。
ログインの有無でビューの表示を変える場合
deviseを導入しているため、user_signed_in?
メソッドが使用できます。
このメソッドは、ユーザーがログイン状態であればtrueを、ログアウト状態であればfalseを返します。
これでログイン状態とログアウト状態で表示されるビューを切り替えることができるようになりました。
# 省略
<% if user_signed_in? %>
<div class="user_nav grid-6">
<%= link_to "ログアウト", destroy_user_session_path, method: :delete %>
<%= link_to "投稿する", new_tweet_path, class: "post" %>
</div>
<% else %>
<div class="grid-6">
<%= link_to "ログイン", new_user_session_path, class: "post" %>
<%= link_to "新規登録", new_user_registration_path, class: "post" %>
</div>
<% end %>
# 省略
Discussion