迷い人

日々勉強。勉強の先に何か見つかるといいなぁ

【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メソッドを使ってまとめてストロングパラメータとして登録することも可能です。

 

以上、ストロングパラメータの説明でした。少しでも参考になれば幸いです。