【rails】ストロングパラメータについて
今回はストロングパラメータについて解説したいと思います。すでに解説しているサイトもたくさんありますが、私の勉強もかねてまとめます。
まずはストロングパラメータとはcontrollers/tasks_controller.rbの下の方に記述してあるdef task_paramsの部分です。
private #省略 def task_params params.require(:task).permit(:content).merge(user_id: current_user.id) end
permitの文字からも想像できるように:contentを許可しています(今回はuser_idも許可するように指定している)
何を許可しているかというとwebから入力したcontent(=タスク内容)を受け取って、テーブルに保存すること。
次にテーブルに保存する部分をみると、以下のようにtask_paramsが使われています。task_paramsでインスタンスを作成し、その後@task.saveで保存していることがわかると思います。
def create @task = Task.new(task_params) #省略 end
何でストロングパラメータの仕組みがいるの?
webから送られてくるパラメータを直接テーブルに保存すればシンプルなのに、わざわざストロングパラメータという仕組みで保存しているのには理由があります。
それは「マスアサインメント機能と脆弱性」を回避するためです。
どういうことかというと、例えばユーザ情報を管理するテーブルがあり、admin権限の有無をadminカラムで管理していたとします。admin権限は通常のユーザに付与されません。
ところがユーザ情報を編集する画面からパラメータを送る時にadminカラムの値を変更するような情報を送られてきたとします。
その時ストロングパラメータの仕組みがないとadmin権限が書き換えられてしまい、本来操作できない機能が操作されてしまう可能性が発生します。
詳しくは以下のリンク先を参照して下さい。とてもわかりやすく脆弱性について解説してくれています。
【Ruby on Rails】ストロングパラメータって何なの? - Qiita
ストロングパラメータの記述方法の色々
今回のtask管理アプリを例にストロングパラメータの記述方法を紹介しましたが、そのほかにも様々な記述方法があります。
form_tagでパラメータを送信するときの書き方
def task_params params.permit(:title, :content) end
form_tagを用いてパラメータを送る場合、requireの部分が不要になります(そもそもform_tagを使うことが少ないですが)
ユーザIDだけ切り出して記述する
def task_params params.permit(:title:, :content) end
def create @task = Task.new(title: task_params[:title], content: task_params[:title], user_id: current_user.id) #省略 end
user_idのようなuserテーブルで管理するパラメータを設定する時に分けて登録することもできます。
もちろん、最初の例で示したようにmergeメソッドを使ってまとめてストロングパラメータとして登録することも可能です。
以上、ストロングパラメータの説明でした。少しでも参考になれば幸いです。