##この記事の目的
先日tech::campとういうプログラミングスクールを卒業しました
この学習を無駄にしないように理解が浅いところを復習する為に書きます
createアクションにストロングパラメータを設定せず、Post.create(params)とだけ書いて値の保存を試みたら、エラーが出たことがこの記事を書くきっかけです。
##1.ストロングパラメータについて
「Web上から入力されてきた値を制限することで、不正なパラメータを防ぐ仕組み」です。セキュリティ上の問題に対処するための仕組みとしてRails4系から導入されました。
参考 https://kirohi.com/strong_parameters_rails
##2.ストロングパラメータを設定する理由
簡潔にいうと管理者情報を乗っ取られないようにする為です。
本来ユーザーから送られてくることのないパラメータが存在していたとしても、それを取り除いて安全にDBの更新を行うことができます。
悪意のあるユーザーが管理者権限付きのユーザーを取得する為にパラメータを改竄しても、許可されたパラメーターだけに絞り込むことができます。
データの登録・更新機能に設定することが多いのもこの理由からです。
以下のquitaの記事が理解しやすいです。
参考 https://qiita.com/ozackiee/items/f100fd51f4839b3fdca8
privateメソッド以下に定義することが多い理由は、クラス内部からしか使わないので、クラス外部で呼び出されるとエラーが起きるようなメソッドが使われるのを防いで、さらにコードの可読性が上げる為です。
##4.ストロングパラメータを設定してbinding.pryで見てみる
まずはストロングパラメータの設定
def create
Post.create(post_params)
end
private
def post_params
params.require(:post).permit(:name, :image, :text)
end
投稿フォームで値を入力してbinding.pryでデバックしてみましょう。
[1]はparamsの中身をみています。permitted: falseと出ていますね。
値の取得に失敗しています。
でも、これでいいんです。
なぜfalseかというとストロングパラメータを設定しているからです。
ストロングパラメーター内に書いたpermitメソッドで指定したparamsしか保存しません。
続いて[2]でpost_paramsの中身をみています。
これはストロングパラメーター内に書いたpermitメソッドの返り値です。
こちらはpermitted: trueとなっています。
このようにbinding.pryでデバックすると入力されてきた値をちゃんと制限できていることがわかります。
##まとめ
ストロングパラメータについて備忘録として書いてみました。
間違った記述があればご指摘お願いします。