はじめに
Railsを学習し始めた際に、ストロングパラメータに出会ったが、解説記事などを読んでも、何故これが必要なのかが当時分からなかったが自分と今現在でいまいち重要性がわからない人向けの記事です。
def user_params
params.require(:user).permit(:name, :email)
end
結論
ストロングパラメータは不正な情報の受け取り防止のために使用!!
と簡単に言えば上記になりますが、当時の自分にはこの説明ではピンとこなかったことを覚えています。。。
当時の自分が何故理解できなかったのか
この意味を理解できなかった最大の理由は、
そもそも入力フォームに記載しなければ受け取れないじゃん??
と思ったからだと思います。
しかし、そんなことは無いことを実際に誰でもできる方法にて解説いたします。
簡単にストロングパラメータのコードを説明
ストロングパラメータのコード詳しい解説は、他の記事にたくさんのっているため、ここでは簡単に説明します。
def user_params
params.require(:user).permit(:name, :email)
end
ここで、ユーザー登録のケースで考えます。
上記フォームの入力にて送られてくるデータは以下になります。
{
"authenticity_token"=>"NQxL18oxz9ePkLv5VS_1a5b8-WEO1aFtEUDtDIAuxvlY_gD_w_2pPmWBjM0YLrwh7Q4-Os1Yv_aaNbYVMUUsaA",
"user"=>{"name"=>"a", "email"=>"a"},
"commit"=>"Create User",
"controller"=>"users",
"action"=>"create"
}
上記はrailsではparams
と記載することで受け取ることが可能です。
しかし、userの登録には"user"=>{"name"=>"a", "email"=>"a"}
のみで良いため、必要な部分だけを取り出すために、require(:user)
を使用します。
params.require(:user)
{"name"=>"a", "email"=>"a"} # 受け取るデータ
上記でも必要なパラメーターは受け取れてはいますが、name、email以外は必要ないためpermit(:name, :email)
を用いてそれしか受け取らないようにします。
params.require(:user).permit(:name, :email)}
{"name"=>"a", "email"=>"a"} # 受け取るデータ
params.require(:user).permit(:name)}
{"name"=>"a"} # nameのみにするとnameの値のみ抽出される
では何故permitが必要なのかを次以降で具体的に説明します。
#ユーザー登録フォーム
下記テーブル構成にてデータが管理されていると仮定します。
下記adminは管理者権限を表しているものとします。
ここがtrueのユーザーは編集・削除権限などが与えられると仮定し、基本的にはfalseになるように設定している状況で新規ユーザー登録を行ってみます。
カラム名 | 型 | デフォルト |
---|---|---|
name | string | - |
string | - | |
admin | boolean | false |
ここで、コントローラに記載しているストロングパラメータはadminも受け入れてしまっている状態にします。
def create
@user = User.new(user_params)
# 以下省略
end
def user_params
params.require(:user).permit(:name, :email, :admin)
end
以下画像のフォームがあった際に登録ボタンを押すと
【結果】
adminは問題なくfalseとなっている。
#ユーザー登録フォームの改ざん
ここでそもそも入力フォームに記載しなければ受け取れないじゃん??
の当時の自分の疑問を解決します。
実はChromeの開発者ツールより、新たなフォームを作成することが可能のため、admin用のフォームを作成し送信することが可能となります。
上記画面で右クリックし、”Edit as HTML”を選択すると、HTMLを挿入できるので、以下を挿入すると。。。
<input type="checkbox" value="1" name="user[admin]" id="user_admin">
チェックボックスを画面上に表示することが可能となります。
実際にチェックし、送信ボタンを押すと。。。
【結果】
adminがtrue
の状態で保存が可能!!!
適切にpermitを記載していた場合
ストロングパラメータからadminを消し同様の動作を行ってみます
def user_params
params.require(:user).permit(:name, :email)
end
想定外のデータは受け取れない設定になっているため、adminはfalse
にて設定されます。
結論
ストロングパラメータは不正な情報の受け取り防止のために使用!!
上記の意味がこの記事で少しでも分かりやすくなっていれば幸いです!