備忘録として
ユーザー管理機能を実装できるdevise
デフォルトとして「Eメールアドレス」「パスワード」
のカラムがすでに存在しており、ストロングパラメーターも使用できるが、自分で追加するカラム(ユーザー名など)にはストロングパラメーターは使えない状態なので、使えるようように記述する必要がある。
前提
- deviseを導入済み→deviseの導入手順
- マイグレーションファイルでカラムを追加している
application_controller.rbファイル
すべてのコントローラーが継承しているファイル。
ここに処理を記述しておくことで、すべてのコントローラーで共通となる処理を作ることができる。
deviseの処理を行うコントローラーはGem内に記述されているため編集することができない
ので、このapplication_controller.rbを編集していく。
devise_parameter_sanitizerメソッド
deviseにおけるparamsのようなメソッド。deviseのUserモデルに関わる「ログイン」「新規登録」などのリクエストからパラメーターを取得できる。
このメソッドとpermitメソッドを組み合わせることにより、deviseに定義されているストロングパラメーターに対し、自分で新しく追加したカラムも指定して含めることができる
。
普通のストロングパラメーターと同じく、新たに定義するPrivateメソッド
の中で使用します。
private
def configure_permitted_parameters # メソッド名は慣習(自由につけても構わない)
# deviseのUserモデルにパラメーターを許可
devise_parameter_sanitizer.permit(:deviseの処理名, keys: [:許可するキー])#追加したカラムを記述
end
第一引数の処理名には、deviseですでに設定されているsign_in, sign_up, account_updateが使用できる。
処理名 | 役割 |
---|---|
:sign_in | サインイン(ログイン)の処理を行うとき |
:sign_up | サインアップ(新規登録)の処理を行うとき |
:account_update | アカウント情報更新の処理を行うとき |
実際に編集してみる
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
のif
というオプションを使用している点に注目。
これは、値にメソッド名を指定することで、その戻り値がtrueであったときにのみ処理を実行するよう設定している。
今回は:devise_controller?
というdeviseのヘルパーメソッドを指定して、もしdeviseに関するコントローラーの処理であれば、そのときだけconfigure_permitted_parametersメソッドを実行するように設定してる。
まとめ
- 自身で追加したカラムでストロングパラメーターを使えるようにするには、特別な記述が必要
- devise_parameter_sanitizerメソッドを使用する
- application_controller.rb内に記述する
※補足等があればコメントいただけると幸いです。