みやちゃ
皆さんこんにちは、みやちゃです!
物理とプログラミングについて解説しています!
今回はRailsの開発では必ず出てくるストロングパラメータについて解説します!
ストロングパラメータとは、「params.require(:model)....」この部分のことですね!
こちらの記事では、newとcreateの違いについて解説しました。
そこでは、controllerでcreateアクションを以下のように定義しました。
def create
@post = Post.new(post_params)
if @post.save
redirect_to posts_path
end
end
def post_params
params.require(:post).permit(:body, :title)
end
@postに「post_paramsという引数が与えられた上で、作成された投稿」を収納しています。
今回は、このpost_paramsの定義を掘り下げて解説していこうと思います。
目次
ストロングパラメータ
def post_params
params.require(:post).permit(:body, :title)
end
post_paramsでは、
requireメソッドで、パラメータ群を指定し、
permitメソッドで、利用するパラメータを指定しています。
permitメソッドでは、送られる必要のない、もしくはパスワードなどの重要なパラメータを除外することができます。
これらの作業によって、送信されるパラメータが安全なデータかどうかを検証した上で、それらの情報を取得するそうです。
このことは、ストロングパラメータと呼ばれています。
また先頭のparamsメソッドについては、
paramsメソッドは、送信されてきたパラメータの受け渡しをするメソッドです。
今回は、「フォームに入力された値」を受け渡しますが、
他にも、「リンクによる受け渡し」、「配列やハッシュでの受け渡し」の時などでparamsメソッドを使うことができます。
params.require(:post).permit(:body, :title)の意味は、
「与えられたパラメータを、require/permitメソッドによってどのパラメータを許可するかを指定し、安全なデータかどうかを検証した上でそれらの情報を取得する」
という流れを宣言したものだったのですね。
投稿が作成されるときのログの様子
投稿が作成されるときのログの様子(terminal)を見てみます。
Started POST "/posts" for ::1 at 2020-08-29 12:58:30 +0900
(0.1ms) SELECT sqlite_version(*)
Processing by PostsController#create as HTML
Parameters: {"authenticity_token"=>"wiAWfvIwDbkWQCdlDNzkljQxmF6IMuSr2FH+FjHeyon90nEhqYDjoNbE3iY+10iJGva6MIPiEHc7Lmrsny2/AQ==", "post"=>{"title"=>"post4", "body"=>"四番目の投稿です。"}, "commit"=>"Create Post"}
上のようになっていました。
Parametersが与えられているのがわかります。
"post"=>{"title"=>"post4", "body"=>"四番目の投稿です。"},
とあるので、titleとbodyの2つのパラメータが与えられていますね。
上で説明したように、
ストロングパラメータによって、許可するパラメータを指定し、安全を確認している
とありましたが、
では、それをしなかったらどうなるのでしょうか。
ForbiddenAttributesError
params.require(:post).permit(:body, :title)
は、requireによってパラメータ群を指定し、permitによって許可するパラメータを指定しているので、permit以降のコードを消してみます。
params.require(:post)
として、投稿を作成しようとしたらどうなるのでしょうか。
パラメータ群が指定されただけなので、
newアクションで取得したパラメータを全て引数(post_params)に渡すということになります。
では実行してみましょう。
ForbiddenAttributesError(禁止されている属性エラー)とエラーが出ました。
このストロングパラメータは、
ユーザー(クライアント)側に、どのパラメータでモデルを作成することを許可するかを設定します。
ストロングパラメータを介さずに、モデル作成を行おうとすると、先ほど出た
「ForbiddenAttributesError」になるみたいです。
モデル作成の時に渡すパラメータは、require/permitメソッドでパラメータを指定してあげないといけないようです。
まとめ
今回は、ストロングパラメータについて解説しました。
ここまでご覧いただきありがとうございます!