[Rails] 'devise'を使ったユーザー管理機能導入法

## はじめに

webアプリケーションを作成にあたって、ユーザー管理機能は頻繁に導入することになるので、Railsに'devise'を導入する手順をまとめてみました。




## 'devise'とは

Railsでユーザー管理機能を簡単に実装できる、非常に便利なGemです。
devise導入後、deviseのビューを作成するコマンドを実行すれば、ものすごく質素ですが、ログインやユーザー登録画面のビューも用意してくれます。後述します。



## deviseの導入

まずは、導入したいRailsアプリケーションのGemfileの一番最後の行に以下のように追記しましょう。


```:Gemfile
gem 'devise'
```

追記ができたら、ターミナルでカレントディレクトリがdeviseを導入するディレクトリであるか確認しましょう。もし、違うディレクトリにいるようでしたら、cdコマンドで移動しましょう。


下記のコマンドを実行してGemをインストールします。

```:ターミナル
% bundle install
```

**注意！**
続けて下記のコマンドを実行することを忘れないでください！！

```:ターミナル
% rails g devise:install
```

私はついつい、bundle installしたら導入し終わった気になってしまって、このコマンドを忘れてしまいます。
このコマンドはdeviseを使用するために必要な設定ファイルを自動で作成してくれます。



とりあえず、これでdeviseが使えるようになりました。
続けて、Userをデータベースに保存できるところまでやっちゃいましょう！



## Userモデルを作成

Userモデルはdeviseの機能を利用するので、通常Railsでモデルを作成するときとは少し違うことを気をつけましょう。

ターミナルで下記の記述をします

```:ターミナル
% rails g devise user
```

モデル名の前にdeviseの記述があることに気をつけましょう。
この記述によって、ユーザーに関するモデルとマイグレーション、そしてルーティングにも自動的に**devise_for :users**の追記がされているはずです

ほんとdeviseさん、至れり尽くせりです。。。


ちなみにこのdevise_forという記述はユーザー機能に必要なルーティングを一度に生成してくれるdeviseのメソッドのようです。


## テーブル作成

自動生成されたマイグレーションファイルにはすでにemailとpasswordに関してのカラムの記述はなされているので、名前の登録などが必要であれば、追記してからマイグレーションを実行しましょう。

```:ターミナル
% rails db:migrate
```

これでusersテーブルの完成です。
確認する場合は一度サーバーを終了してから、再起動させることを忘れずに！



## ビュー作成

ターミナルにて下記のコマンドを実行しましょう

```:ターミナル
% rails g devise:views
```

これでdeviseに関するビューファイル（ログイン画面と、新規登録画面)を生成できました.
しかし、このデフォルトの画面はかなり質素なので、デザインを変えたり、また必要な登録項目があるならば追加でフォームを作成し、自分好みに編集しましょう。

ビューファイルは
app/views/devise/registrations/new.html.erb（新規登録）

app/views/devise/sessions/new.html.erb（ログイン）

に作成されているはずです。



## deviseに関するストロングパラメーターについて

ストロングパラメーターの設定も、通常とは少し違っています。



通常であれば、コントローラーにストロングパラメーターを記述し、受け取れるパラメータの制限をかけていましたが、deviseの処理を行うコントローラーはGem内に記述されているため、こちらから直接編集することができないのです。


では、どこにストロングパラメータ〜の記述をするのか、それはRailsの仕組みを紐解くことで見えてきます。



Railsアプリケーションのコントローラーは全て、基本的に**application_controller.rb**というファイルを継承しています。

applicationコントローラーが**親**
そのほかのコントローラーが**子**になります。子供は親の遺伝子を受け継ぎますから、親のコントローラーに記述したことは子たちに受け継がれます。そうなのです！そういうことです！（私はそういうふうに理解しました笑）




もちろんdeviseのコントローラーも例外ではなくapplicationコントローラーを継承しているので、このファイルを編集することでdeviseのコントローラーに直接編集しなくてもストロングパラメーターを設定することができそうです。


下記のように編集しましょう（もしnicknameというカラムをテーブルに追加していた場合）

```Ruby:app/controllers/application_controller.rb
class ApplicationController < ActionController::Base

  private
  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname])
  end
end
```

:sign_upという記述は新規登録する時に許可するということです

configure_permitted_parametersというメソッドの名前ですが、なんでもいいみたいなんですが、習慣的にこのメソッド名で定義することが多いみたいです。


これはapplicationコントローラーなので、全てのコントローラーに対してこのメソッドが定義されていることになります。

ので！deviseのコントローラーだけで発動させるために下記のように記述します。

```Ruby:app/controllers/application_controller.rb
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
```

before_actionのオプションでifを使用しています。
**if: :devise_controller?**という記述はもしdeviseに関係する処理であれば実行するという意味で、これで通常の他のコントローラー全てに対してこのメソッドが発動することはありません。



## 最後に


この操作はアプリケーションを作る際に必要になることが多くなりそうなので、しっかりと覚えていきたいです。

特にbundle installした後の**rails g devise:install**は本当に忘れやすいので、皆さんも気をつけてください。

installの後のinstallは忘れる。。。