【Rails】deviseの「新規登録」「ログイン」「情報更新」機能をカスタマイズする際に必要なストロングパラメーターのsanitizerメソッド


はじめに

deviseの「新規登録」「ログイン」「情報更新」機能をカスタマイズする際に必要なストロングパラメーターのsanitizerメソッド

と長いタイトルになってしまいましたが、要は「deviseのユーザー管理機能」についてです。
deviseを使うとユーザー管理機能が簡単に作れますが、デフォルトの機能を変更するには様々な設定が必要です。
今回は「新規登録」「ログイン」「情報更新」をカスタマイズする際に必要な処理について紹介します。

目次

1.結論
2.devise_parameter_sanitizerメソッドについて
3.sanitizerメソッドの構文
4.処理毎の記述
5.記述するファイル
6.まとめ

対象の方

deviseを使った事がある
deviseのデフォルト以外の実装がしたい
ストロングパラメーターを理解してる

開発環境

ruby 2.6.5
rails 6.0.0
devise 4.7.3

1.結論

まず結論は以下のような記述になります。

app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  #もしdeviseのコントローラーの事なら全てのアクションの前にメソッドを読み込む
  before_action :configure_permitted_parameters, if: :devise_controller? #ログイン機能について
  before_action :configure_account_update_parameters, if: :devise_controller? #編集機能について

  private
  #ログイン機能について
  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname,  :family_name_kanji, :first_name_kanji, :birthday])
  end
  #編集機能について
  def configure_account_update_parameters
    devise_parameter_sanitizer.permit(:account_update, keys: [:nickname,  :family_name_kanji, :first_name_kanji, :birthday])
  end

end

※注意:「新規登録」と「情報更新」しか実装していないので、その2つについて記述します。

2.devise_parameter_sanitizerメソッドについて

まずメソッドの説明をします。

2.1 使用するタイミング

「新規登録」「ログイン」「情報更新」をデフォルト以外にカスタマイズしたい時です。

2.2 sanitizerメソッド

sanitizerメソッドとはdeviseのUserモデルに関わるパラメーターを取得するメソッドです。
deviceの内部にデフォルトでパラメーターを取得する記述がされてますが、これに消毒剤=(sanitizer)をかけてカスタマイズできる状態にすることです。
※注意:個人的な解釈の仕方です。

次に、sanitizerメソッドとpermitメソッドを組み合わせます。
そうする事で、deviseにデフォルトで定義されているストロングパラメーターに対して、自分で新しく追加したカラムも含めることができます。

2.2 二種類あるpermitメソッドの違い

permitメソッドが二種類あるので、脱線しますが少し説明します。
「sanitizer」のpermitはdeviseのパラメーターを取得するためのメソッドです。
「Rails」のコントローラーで保存時などに使用してるparamsのpermitメソッドとは異なります。

下記がそれぞれの例です。

controller.rb
#例) paramsのpermitメソッド
params.require(:モデル名).permit(:許可したいキー)
app/controllers/application_controller.rb
#例) devise_parameter_sanitizerのpermitメソッド
devise_parameter_sanitizer.permit(:deviseの処理名, keys: [:許可したいキー(カラム名)]

3. sanitizerメソッドの構文

メソッド名はconfigure_permitted_parametersと慣習的に定義されてますが、自由に命名しても差し支えありません。

app/controllers/application_controller.rb
private
def configure_permitted_parameters  # メソッド名は自由に命名しても差し支えありません。

  # deviseのUserモデルにパラメーターを許可
  devise_parameter_sanitizer.permit(:deviseの処理名, keys: [:許可したいキー(カラム名)])
end

※注意:プライベートメソッドの中で定義します。

以上devise_parameter_sanitizerメソッドの説明でした。

4.処理毎の記述

「2.1 使用するタイミング」 でも触れましたが処理する目的で「:devise処理名」の記述が変わります。
処理する目的は「新規登録」「ログイン」「情報更新」です。

処理名 目的
:sign_in ログイン(サインイン)の処理を行うとき
:sign_up 新規登録(サインアップ)の処理を行うとき
:account_update アカウント情報更新の処理を行うとき

5.記述するファイル

「どこに記述するか」ですが、これは「すべてのコントローラーが継承しているファイル」です。
つまり、application_controller.rbファイルです。
このコントローラーが読み込まれた後、他すべてのコントローラーが読み込まれます。
また、全てのアクションの処理前に処理したいのでbefore_actionを使います。

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])
                   #↑(:deviseの処理名, keys: [:許可したいキー(カラム名)])
  end
end

これでほとんどの実装ができました。あとはpermitも後を自分のしたい事に応じて編集するだけです。
上記は
deviseの処理名 = :sign_up
keys = [:nickname]
で実装してます。

6.まとめ

手順のポイントは
application_controller.rbに記述
before_actionを設定
sanitizer.permitメソッドを使用

以上、deviseの「新規登録」「ログイン」「情報更新」機能をカスタマイズする際に必要なストロングパラメーターのsanitizerメソッドについてでした。

最後に

私はプログラミング初学者ですが、同じ様に悩んでる方々の助けになればと思い、記事を投稿しております。
それでは、また次回お会いしましょう〜