##はじめに##
今回は学習中に作成した簡易版twitterでストロングパラメーターをアウトプットしていきます。
必要な情報だけをDBに保存していきます
仮に全てのデータ(パラメーター)を受け取る仕様の場合、悪意のあるパラメーターによって第三者にデータを改竄されてしまうなど、セキュリティ上に問題が起きてしまう恐れがあります。
回避するためには、ストロングパラメーターを使用して受け取るパラメーターを制限することが大切です。
##実際にどんな情報が送られてきているか##
モデルやビュー等は割愛させていただき下記がコントローラーになります。
実際に投稿ボタンを押したら何が送られてくるのかbinding.pryで確認します。
def new
@tweet = Tweet.new
end
def create
binding.pry #一度binding.pryで止めて中身を見るための記述
Tweet.create(tweet_params)
end
[1] pry(#<TweetsController>)> params
=> <ActionController::Parameters {"authenticity_token"=>"dGa9JyZphq/J2xJrdx7ZE47LlxWeBimigLTW5GgkU+MuYuCa/qDCnCJ3L5bdMCOVg+IfB+qyDnZdGa3sNHtEJw==",
"tweet"=>{"image"=>"https://tech-master.s3.amazonaws.com/uploads/curriculums/images/Rails1-4/sample.jpg", "text"=>"スカイツリーが写った綺麗な景色!"},
"commit"=>"SEND", "controller"=>"tweets", "action"=>"create"} permitted: false>
"tweet"の以下の{}に入っているデータだけ欲しいのですが、余計なものまで入っています。
image(写真のURL)とtext(つぶやき)だけのデータが欲しいのでここでストロングパラメーターを使います。
##ストロングパラメーター##
門番みたいな役割だと思っています。
「なんでも通すわけにはいかんぞ!!」
という感じで記述して許されたparamsしか通しません。
まずはrequireメソッド
params.require(:モデル名)
必要とする情報を指定します。主にモデルを指定します。
今回では3行目に記述されているtweetです。
次にpermitメソッド
params.require(:モデル名).permit(:キー名, :キー名)
してしたキー名をDBに保存することを許可すると覚えます。
今回ではimageとtextを指定します。
params.require(:tweet).permit(:image, :text)
このような形になります。
私が覚えやすいなと思った例えを紹介します。
まずはAmazonでイヤホンを頼んだとします。
家に商品届き、Amazonの箱の中に入っています。
その箱を開けるためにrequireメソッドで開封をし、今度はイヤホンの箱が入っています。
イヤホンの箱を開けるためにpermitで開けやっとイヤホン現物となります。笑
def create
Tweet.create(tweet_params)
end
private
def tweet_params
params.require(:tweet).permit(:image, :text)
end
end
tweet_paramsというストロングパラメーターを定義し、createメソッドの引数に使用して、tweetsテーブルへ保存できます。