Ruby on Rails プログラミング

【Rails】require/permitメソッド ストロングパラメータとは

 

みやちゃ

 

皆さんこんにちは、みやちゃです!

物理とプログラミングについて解説しています!

今回は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メソッドでパラメータを指定してあげないといけないようです。

まとめ

今回は、ストロングパラメータについて解説しました。

ここまでご覧いただきありがとうございます!

© 2024 とあるエンジニアの備忘録ブログ Powered by AFFINGER5