はじめに
私は半年間、プログラミングスクールで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
has_many :tweets
・tweet
belongs_to :user
ユーザーがつぶやきを投稿(create)する時について考えていきます。
流れとしては、投稿画面(new)→DBへ登録(create)です。
我々がイメージする、投稿フォームからDBへの保存ってこんな感じですよね。
...こんな感じでシンプルに、DBに送れたらいいんですけどね
フォームからsubmitされた実際のデータを見てみると、こんな感じでハッシュ形式の物がリクエストパラメータとして送られています。
想定していたよりも、だいぶ複雑なデータですね
このデータを、Strong Parametersで、必要な属性値のみを指定し、DBに保存出来る形式に整理していきます。
コードを見てみましょう!
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)
最初のparamsに比べて、断然、スッキリしましたよね
そして、permittedの値が、trueに変わりましたね。
これは、strong parametersを経て、許可されたパラメータ以外は除去し、安全にDBに保存出来る形式にしたことの証です。
以上が、Strong Parametersの概要です。
今度は、より複雑なparams(tweetに他のデータも紐付いている場合など)のStrong Parametersの使用方法を書ければと思います。
ご覧いただき、ありがとうございます。
プログラミング、お互い頑張っていきましょう!