LoginSignup
0
0

More than 3 years have passed since last update.

devise_parameter_sanitizerメソッドが訳わかってないのでここにアウトプットしてみる

Posted at

Railsで写経をしていた際に出てきたメソッドで「何これ」となったので、もう一度復習してみて、それをアウトプットと忘備録として書いてみようと思います。

devise_parameter_sanitizerとは

devise_parameter_sanitizerはdeviseというgemに用意されているメソッドで
ユーザー管理機能を実装する際に、ログインや新規登録などのリクエストからパラメーター(名前やメールなど)を取得するメソッドであるということです。

パラメーターについて

パラメーターとはリクエストに含まれる外部から渡されるデータで、
コントローラーで処理されて、モデルを通じてテーブルのカラムにデータとして登録されます。
ブラウザの入力欄などから入力して送られてくるデータといったところでしょうか…

フォームにデータを入力してそれをリクエストとして送信するためには下記のような記述を書いてみます。

index.html
#これは送り手側の話
<%= form_with url:”URL”, method: :post, local: true do |form| %>
<%= form.text_field :content %>
<% end %>

フォームに入力させてURLにデータを送るものだと思っています。
2行目の":content"の部分がparamsとなり、"params[:content]"として
外部からコントローラーへ渡されるデータになります。

今のは送る側の話でしたが、受け手側に関しても考えてみようと思います。
受け手側は指定したキー(カラム名)を持つパラメーターのみを受け取れるように制限することができます。
これをストロングパラメーターと呼びます。
記述としては下記の通りになります。

players_controller.rb
#こちらは受け手側の話
params.require(:player).permit(:name, :age)

上記の記述ではPlayerモデルの"name"というキー(カラム)と"age"というキー(カラム)のデータのみをリクエストから受け取るということとなります。requireでカラムがあるテーブルを指定します。
リクエストの中に"name"や"age"というキーの他にも仮に"height"や"speed","defence"のデータが入っていれば、それらは受け取らないということになります。

devise_parameter_sanitizerメソッドに戻ります。

どのように記述するかは下記の通りになります。

application_controller.rb
#deviseの場合
devise_parameter_sanitizer.permit(:sign_up, keys: [:email])

devise_parameter_sanitizerはdeviseのメソッドになるので、モデルはdeviseによって作成されているUserモデルになりますので上記のrequireは記述しません。
サインアップする際に取得するパラメーター(データ)は"email"という意味になります。

このdevise_parameter_sanitizerでコードを書いてみて思ったことは、deviseのgemはログイン機能を実装する上でかなり便利だなということです。一からログイン機能を作らなくても新規登録、ログインの有無ができる訳です。
devise_parameter_sanitizerに必要な情報(カラム)を入れてあげることで、あとはdeviseがある程度やってくれるため、まだ訳わかってないところですが、非常に便利なメソッドだなと感じています。

最後に

この記事を書いたものの、まだ自分でもわかっていないところがあります。この認識がおかしいと思われるところがあればいっていただけるとありがたいです。よろしくお願いします。

参考した記事

Railsのrequire/permitメソッドの使い方を現役エンジニアが解説【初心者向け】
https://techacademy.jp/magazine/22078

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