0
2

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.

deviseでのストロングパラメータの設定について

Posted at

そもそも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を指定する

これだけ書いてもまだ覚えきらんので、備忘録として。

0
2
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
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?