Railsとdeviseで複数のモデルを管理するときのstrong parametersの設定方法
deviseのwikiとかにも書いてあるんだけどそれじゃ実装できなかったので、一応ここにまとめておく
deviseで扱うモデルがUserだけじゃなくて複数ある場合のstrong parametersの設定方法
この記事に1つのモデルの時と複数のモデルの時のだいたい方法書いてあるんだけど、複数のモデルのやつが本当に若干違うのでまとめておく。
まとめというか補足情報的な感じ
開発環境
ruby '2.2.0'
rails '4.2.1'
devise '3.5.1'
「独自のサニタイザーを定義する方法の部分」を変更
Devise::ParameterSanitizerを継承してサニタイザーを定義する。
変更前
class User::ParameterSanitizer < Devise::ParameterSanitizer
def sign_in
default_params.permit(:username, :email)
end
end
変更後
class UserParameterSanitizer < Devise::ParameterSanitizer
def sign_up
default_params.permit(:name, :email, :password)
end
end
とする。
要するに
user_parameter_sanitizer.rb
User::ParameterSanitizer
#を
UserParameterSanitizer
#にしないとエラーが出るのと、
#登録する時のメソッドを定義し直さないといけないから
sign_in
#から
sign_up
#にする。
以上。
あとはこの記事にあるように
application_controller.rb
protected
def devise_parameter_sanitizer
if resource_class == User
UserParameterSanitizer.new(User, :user, params)
else
super # Use the default one
end
を追加するだけ。
Sanitizerをどこに置くのが正解なのかわからなかった
Sanitizerをどこに置くのが正解なのかわかんなかったからとりあえずlib/の下に置いた。
どこに置くのが適切なのか教えて下さい。。m(_ _)m
lib以下のautoloadの仕方とか命名規則的なのはこの記事に載ってるので参考にしてくだされ。
参考記事一覧
Rails の認証プラグイン Devise での Strong Parameters について
Rails4 で lib ディレクトリの自作ライブラリを autoload
Rails 4 + Custom Devise attributes — ParameterSanitizer Error - Stackoverflow