2つのdeviseを作成した時にdevise_parameter_sanitizerを個別に設定したい


2つのdeviseを作成し、個別devise_parameter_sanitizerの設定をしたい時の手順を書きます。

オリジナルアプリケーション作成中です。

ruby '2.6.5'
rails '6.0.0'

まず前提条件として各deviseの、ルーティング、モデル、コントローラー、ビューの設定ができている状態でスタートします。
上記作成方法はこちらを参考にしてください。

さて通常1つのアプリケーションに対して1つのdeviseであれば、application_controller.rbファイルにbefore_actionを使ってdevise_parameter_sanitizerの処理を行います。

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

この様にしてユーザー登録の際に特定のカラムを許容する事ができます。

2つのdeviseを作成した時に別々のモデルのdevise_parameter_sanitizerの設定方法です。

今回はuserとdoctorとの2つのdeviseを作りました。

まずリポジトリのREADMEにあるので試してみたがいまいちピンとこない。継承するファイルを作るのか、既存のファイルを活用するのかわかりませんでした。

結果として個別のファイルは app/controllers/users/registrations_controller.rb があるのでそれを使う。

   User用であれば、
    app/controllers/users/registrations_controller.rb

    Doctor用であれば、
    app/controllers/doctors/registrations_controller.rb

user用ファイルの中身の大量のコメントアウトから下記の記述を見つけます。

app/controllers/users/registrations_controller.rb
   #  before_action :configure_sign_up_params, only: [:create]

のコメントを有効化します。
.

app/controllers/users/registrations_controller.rb
   before_action :configure_sign_up_params, only: [:create]

これで、ユーザー作成時は、
configure_sign_up_paramsが呼び出されるようになりましたので、
同ファイル中にある、
def configure_sign_up_params
をコメントアウトし、有効にします。

app/controllers/users/registrations_controller.rb
   def configure_sign_up_params
     devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname])
   end

そしてこちらの(:sign_up, keys: [:nickname])の部分に追加したいからむを書きます。

app/controllers/users/registrations_controller.rb
 def configure_sign_up_params
    devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname, :password])
  end

これと同様の作業をdoctor様でも行います。
ファイルはapp/controllers/doctors/registrations_controller.rb です。

お気づきの方もいるとは思いますが、applicationコントローラーでは定義せず、個別ファイルでbefore_actionで呼び出しするのでapp/controllers/application_controller.rb で devise_parameter_sanitizeは書きません。

上記を行った際に

   TypeError

   superclass mismatch for class DoctorController

   class DoctorController < ApplicationController

とエラーになりました。よーく見ると、
class DoctorController < ApplicationControllerがDoctorになっています。

   class DoctorController < ApplicationController
   class DoctorsController < ApplicationController

app/controllers/doctors/registrations_controller.rbに継承するので""s""がないので記述します。

 rails は命名規則が厳しので、気おつけます!!