スポンサーリンク

【Ruby】ストロングパラメーターって何??

みなさんこんにちは!
のむ(@nomu_engineer)です!

Rubyに出てくるストロングパラメーターの意味がよくわからないって思っている方多いと思います。
実はいまいち僕もわかっていません。

なので一緒に勉強しましょう!!笑

この記事を読むメリット
・ストロングパラメーターについて理解できる
・ストロングパラメーターの記述の仕方を知ることができる

この記事を読むおすすめの読者
・プログラミング初心者
・駆け出しエンジニア
・ストロングパラメーターをイマイチ理解できていない方

ぜひストロングパラメーターについていまいちわからないという方は最後まで読んでみてください!

ストロングパラメーターって何??

ストロングパラメーターというのは、指定したキーを持つパラメーターのみを受け取れるように制限するものです。

そもそもパラメーターって何??って思った方もいるかもしれねいので。軽く説明します。
パラメーターとは、リクエストに含まれてサーバーの外部から渡されるデータのことです。

そう、データや情報のことです。
パラメーターにはURLに含まれるパラメーターやフォームから送信されてくるパラメーターなどがあります。

これらはparamsと呼ばれる箱に格納されて届けられます。

paramsとは、パラメーターをハッシュのような構造で格納している箱のようなものです。
フォームで送信されたパラメーターはparamsの中に格納されてコントローラーで受け取ることができます。

と言った感じでもう一度ストロングパラメーターがなんなのかっていうと、指定したキーを持つパラメーターのみを受け取れるようにするものです。

パラメーターはハッシュのような構造のparamsに格納されているので、キーを指定することで、パラメーターを指定することができます。

記述は以下のような記述をします。

def test_params
  params.require(:キー名)permit(:キー名)
end

実際にキーとバリューを入れてみると下記のような記述になります

def test_params
  params.require(:user)permit(:name, :age)
end
=>{name: "note", age: 10}

ここで二つキー名が出てきましたね。
まず、require(:キー名)について。

requireとはメソッドの一つです。
今回の場合はモデルに対応するキーが存在するかを確認し、存在する場合はそのバリューを返すために使用してます。

paramsは二重構造になっているので、requireメソッドを使い、paramsのハッシュ内の、キーがuserのバリューを取り出します。
(キーuserの中に、取り出したいキーがあるため。)

paramsハッシュ内には他にも沢山のキーがありますので、requireでモデルに対応するキーを取得します。

それが終わったら、さらにrequireで取り出した、userのハッシュの中から取り出したいキーを指定します。
それがpermitの役割です。

permitというのは、メソッドの一つです。
どのようなメソッドなのかというと、paramsで取得したパラメーターに対して、保存の許可処理を行うメソッド。

つまり、permitで指定されたキーのみが保存が許可されますということ。

今回はnameとageを指定しているので、最終的にこの二つのパラメーターのみが保存可能になるということです。

流れをまとめると、

①paramsとして送られてくるパラメータは沢山の情報、データを持っている。
②requireを用いてparamsの中から、モデルに対応するキーのバリューのみを取り出す。
③その中からさらに、取得したい情報、データのみをpermitを用いて取得すると言った流れになります。

permitを使用しないと、必要ないたくさんのパラメーターが送られてきてしまい、それはいいことではありません。
なぜそれが良くないのかというと、意図しないデータの更新などがされてしまうからです。

他人のログインパスワードを変更するパラメーターを送信して、勝手にパスワードの変更ができたりしてしまいます。
なので、指定したパラメーターのみを受け取れるようにストロングパラメーターを使います。

「Mass assignment 脆弱性」このワードで検索したらたくさんのことが出てきましたので、詳細を知りたい方はこちらのリンクから調べてみてください!

ストロングパラメーターはコントローラー内のプライベートメソッドに定義します。
プライベートメソッドとは、クラスの外から呼び出すことができないメソッドです。

Rubyではprivateと記載した以下のコードがプライベートメソッドになります。

プライベートメソッドのメリットは以下の2点です。
1、Classの外から呼び出されては困るメソッドの隔離。
2、可読性
しっかりと使い分けることで、読みやすさの向上につながります。

ストロングパラメーターがなんなのかというのをまとめて終わりたいと思います。

最後に

最後にまとめて終わりたいと思います。

・ストロングパラメーター
 ・・・指定したパラメーターのみを取得するためのもの。

・パラメーター

 ・・・リクエストに含まれて外部から渡されるデータ、情報のこと。

・params

 ・・・パラメーターをハッシュ構造で格納している箱のようなもの。

・require

 ・・・大元のparamsからモデルに対応するキーのバリューのみを取り出すメソッド。

・permit

 ・・・requireで取り出したキーの中から、さらに取得したいキーのみを指定するメソッド。

今回の記事内容は以上になります。
ありがとうございました。

スポンサーリンク




この記事を書いた人