13
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

#はじめに
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メソッドについてでした。

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

13
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?