【おさらい】deviseを導入したユーザー管理機能の実装

今回はdeviseというGemを使って実装していく方法をまとめていきます。
deviseとはユーザー管理機能の実装が簡単にできるGemで、Railsアプリでは多く使われているみたいです。

devise導入

Gemfileの一番下に記述する。

gem 'devise'

ターミナルで

% bundle install

※Gemをインストールした後はサーバーを再起動しましょう
(反映されるのは起動時なため)

deviseをインストール

% rails g devise:install

インストールすると、deviseの設定関連に使うファイルを自動生成してくれます。

deviseのモデルとテーブル

deviseを導入できたので早速Userモデルを作成していきましょう。
※通常のモデル生成とコマンドが少し異なるので注意

% rails g devise user

これでuserに関するモデルとマイグレーションファイルが生成されました。 また、config/routes.rb を見てみると、devise for : users がセットされ、ユーザー機能に必要なルーティングを自動生成してくれています。
(deviseさんそこまでしてくれてるの...仕事できるなあ)

モデルをとマイグレーションファイルができたら、次の流れはマイグレーションファイルにカラムと型とオプションを記述してmigrateを実行していきましょう。
ちなみにdeviseさんはここでもまた気を利かしてくれてるので、デフォルトでemailとpasswordのカラムは用意されています。
今回はnameカラムを追加します。

      t.string :name,               null: false
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""

マイグレーションファイルが記述できたら、実行しましょう。

% rails db:migrate

続いて、モデルにバリデーションを設定していきます。
ここでもemailとpasswordはデフォルトで設定されているため、記述する必要はありません。
nameが空だと新規登録・ログインができないように設定します。

validates :name, presence: true

devise用ストロングパラメーター

ユーザー登録する場合に使用できる特定のカラムを許容するメソッドです。 これを、application_controller.rbにbefore_actionとして記述します。
なぜapplication_controller.rbなのかというと、deviseの処理を行うコントローラーはGem内に記述されているため、編集することができないからです。
そこで、すべてのコントローラーが継承しているapplication_controller.rbに記述することで、共通の処理を作ることができます。

ユーザーが情報を入力して、それがparamsという箱に入って送られて来るわけですが、
deviseにおけるparamsのような箱が、devise_parameter_sanitizerで、permitメソッドと組み合わせて使います。

では、メソッドを作っていきましょう。
ここでのメソッド名は慣習的にconfigure_permitted_parametersが付けられるそうです。
(なんでわざわざ長くてややこしい名前を慣習的に使ってるんやろ....?)

before_action に configure_permitted_parameters をセットして、メソッド本体は privateゾーンの中に置きましょう。 実際の記述がこんな感じ

class ApplicationController < ActionController::Base
  before_action :config_permitted_parameters, if: :devise_controller?

private
  def config_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :email, :password])
  end
end

この.permit( :sign_up(処理名), keys: [ :(許容するカラム)] )の部分について、permitメソッドが使われていますが、この組み合わせによって使うpermitメソッドはdeviseで定義されているものなので、いつものpermitメソッドとは引数の取り方が異なります。

今回は新規登録をするときの処理なので、処理名は :sign_up で、:keys の配列の中には新規登録の際に必要な情報のカラムのキーが入っています。
ちなみに処理については、
| :sign_in | サインイン(ログイン)の処理を行うとき |
| :sign_up | サインアップ(新規登録)の処理を行うとき |
| :account_update | アカウント情報更新の処理を行うとき |

deviseインストールによって使えるメソッド

user_signed_in?

ユーザーがログイン状態かどうかをtrue or falseで判断する。

current_user

現在ログイン中のユーザーの情報を取得するメソッド

ちなみに、メソッドではないけどメモとして書いておくと、
deviseのビューファイル作成用コマンドは

% rails g devise:views

と、こんな感じかな。

終わりに

コードの記述を見やすくブログに書けたらいいなと思って、マークダウンの書き方から入りました。時間がかかるけど、慣れてくるとめちゃくちゃ良いんだろうなと思うので使っていきます。deviseの基本をざっとおさらいでした。