LoginSignup
4
1

More than 3 years have passed since last update.

Ruby on RailsのStrong Parameters(ストロングパラメータ)について~基礎編~

Last updated at Posted at 2019-11-10

はじめに

私は半年間、プログラミングスクールでRuby on Railsを用いたアプリの開発を学びました。
この半年の振り返りとして、HTML(haml), CSS, Ruby on Rails, JavaScript等で理解が難しかった箇所を、アウトプット(解説)していこうと思います!
第1回目テーマは、『Ruby on Railsのストロングパラメータ』についてです。

※誤り等ございましたら、コメント頂けたら幸いです

Ruby on Railsのストロングパラメータって何?

  • CRUDを用いたアプリケーション(create、read、update、deleteが出来る)において、フォームからデータベースへデータを登録・変更する際に、不正なデータを送付されるのを防止する機能。

具体的には?

  • 悪意のある人がサーバーに、改ざんされたデータを送付し、不正行為をすることが考えられる
    • 例)有料会員しか使えない機能がある場合、userカラムのデータを改ざんし、有料会員になりすまして有料機能を利用してしまう...など。。
  • そのようなことを防ぐために、フォームから送信されたデータは、ストロングパラメータを経由することで、パラメータ内のどの属性を許可して、どの属性を除外するかを制御される必要がある

Strong Parametersの使用方法

  • ここでは、userが、imageとtextを投稿出来るTwitterのようなアプリを想定します。

投稿フォーム
スクリーンショット 2019-11-10 19.05.26.png

ER図とassociationはこんな感じです。
スクリーンショット 2019-11-10 18.32.50.png

・user
  has_many :tweets

・tweet
  belongs_to :user

ユーザーがつぶやきを投稿(create)する時について考えていきます。

流れとしては、投稿画面(new)→DBへ登録(create)です。

我々がイメージする、投稿フォームからDBへの保存ってこんな感じですよね。
スクリーンショット 2019-11-10 17.53.25.png

...こんな感じでシンプルに、DBに送れたらいいんですけどね:disappointed:

フォームからsubmitされた実際のデータを見てみると、こんな感じでハッシュ形式の物がリクエストパラメータとして送られています。

スクリーンショット 2019-11-10 14.46.24.png

想定していたよりも、だいぶ複雑なデータですね:confounded:

このデータを、Strong Parametersで、必要な属性値のみを指定し、DBに保存出来る形式に整理していきます。

コードを見てみましょう!

tweets_controller.rb
  def new
    @tweet = Tweet.new
  end

  def create
    tweet = Tweet.new(tweet_params)
    tweet.save!
    redirect_to root_path
  end

private

  def tweet_params
    params.require(:tweet).permit(:image, :text).merge(user_id: current_user.id)
  end

ここで見ていきたいのは、private以下の、tweet_paramsメソッドです。
このメソッドは、下記のような手順で、paramsをDBに保存出来る形に生成していきます!

1. params.require(:tweet)
paramsのうち、"tweet" => {"image" =>...}のデータのみを読み込むことを指定

2. .permit(:image, :text)
1で読み込んだうちの、キー:image, :textの値を読み込むことを指定

3. .merge(user_id: current_user.id)
tweetテーブルには:image, :textの他に、投稿したユーザーを特定するuser_idを格納します。mergeメソッドを使用することで、1、2で生成されたデータ(ハッシュ形式)に、(user_id: current_user.id)という組のハッシュを追加します

tweet_paramsメソッドで仕上がったデータを見てみましょう
(Let's binding.pry:keyboard:)
スクリーンショット 2019-11-10 18.01.22.png

最初のparamsに比べて、断然、スッキリしましたよね:grin:

そして、permittedの値が、trueに変わりましたね。
これは、strong parametersを経て、許可されたパラメータ以外は除去し、安全にDBに保存出来る形式にしたことの証です。

以上が、Strong Parametersの概要です。
今度は、より複雑なparams(tweetに他のデータも紐付いている場合など)のStrong Parametersの使用方法を書ければと思います。

ご覧いただき、ありがとうございます。
プログラミング、お互い頑張っていきましょう!:keyboard:

4
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
4
1