そもそもdeviceに誤記しやすい名前ひどいと思う。
#0. なんでこの記事を書いたか
そもそもストロングパラメータがややこしくてよくわからないのに、deviseを用いると余計にややこしくなるので、頭の中の整理のために書きました。
#1. 設定の方法について
deviseを使わないリクエストの場合では、ストロングパラメータはコントローラに記述していた。したがってdeviseを用いる場合でもコントローラに記述すればいいやと思いきや、deviseの処理を行うコントローラはGem内に記載されているので編集不可能。
じゃあどうするべきかとなったら、全てのコントローラーが継承しているapplication_controller.rb
に記載をすることになる。
#2. deviseにおけるストロングパラメータ
基本的に通常のストロングパラメータと同じでparamsに対してpermitを指定していく流れになる。が、deviseでのparamsはdevise_parameter_sanitizer
というものが該当する。これを用いてメソッドとして定義すると下記のようになる。
def configure_permitted_parameters # ←deviseの提供元が紹介している名前で、指定ではない
devise_parameter_sanitizer.permit(:deviseの処理名, keys: [:許可するキー])
end
# 参考:paramsのやつ
params.require(:モデル名).permit(:許可するキー)
permitメソッドの引数がparamsの時のものと異なり、:deviseの処理名
の記載が必要となる。
この処理名に関しては3つしかないので覚えておきたい。
処理名 | 役割 |
---|---|
:sign_in | サインイン処理を行うとき |
:sign_up | アカウントの新規登録を行うとき |
:account_update | アカウントの情報を更新するとき |
#3. application_controller.rbの編集について
このストロングパラメータは、deviseに関するコントローラの処理が行われる前に実行されるように設定したい。このため、冒頭にbefore_actionを用いて、事前処理としての設定をする。
before_action :configure_permitted_parameters , if: :devise_controller?
#↑ストロングパラメータのメソッド名なので任意 ↑deviseのヘルパーメソッド
devise_controller?
はdeviseが持つヘルパーメソッドで、deviseに関するコントローラの処理かを判断するもの。
これを用いることによって先に書いたようにdeviseに関する処理の前に事前処理として設定ができる。
#4. まとめ
deviseを用いてユーザー情報の保存などの際に特定のキーのみのやりとりをしたいときにもストロングパラメータを使う。
その際は下記に気をつける。
1) 通常のparamsとは違ってdevise_parameter_sanitizer
使って設定する
2) 状況に応じて3つの処理の中から必要な処理を判断する
3) メソッドの記述はapplication_controller.rbに行う
4) deviseに関するコントローラの処理の事前に実行されるようにbefore_actionを指定する
これだけ書いてもまだ覚えきらんので、備忘録として。