2
1

More than 3 years have passed since last update.

ストロングパラメーターで指定した情報だけ保存

Posted at

はじめに

今回は学習中に作成した簡易版twitterでストロングパラメーターをアウトプットしていきます。

必要な情報だけをDBに保存していきます
仮に全てのデータ(パラメーター)を受け取る仕様の場合、悪意のあるパラメーターによって第三者にデータを改竄されてしまうなど、セキュリティ上に問題が起きてしまう恐れがあります。
回避するためには、ストロングパラメーターを使用して受け取るパラメーターを制限することが大切です。

実際にどんな情報が送られてきているか

このアプリは写真のURLとつぶやきを投稿できるものです。
スクリーンショット 2021-05-14 19.38.23.png

モデルやビュー等は割愛させていただき下記がコントローラーになります。
実際に投稿ボタンを押したら何が送られてくるのかbinding.pryで確認します。

tweet_controller.rb
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テーブルへ保存できます。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1