動作環境
Ruby 2.6.5
Rails 6.0.3.2
ストロングパラメーターを設定する際にrequireが必要な場合と必要でない場合の違いについて、理解するのに時間がかかってしまったので投稿してみました。
##requireが必要な場合
<%= form_with model:@hoge, local: true do |f| %>
<%= f.text_area :fuga %>
<%= f.submit "投稿する" %>
def create
@hoge = Hoge.create(hoge_params)
end
private
def hoge_params
params.require(:hoge).permit(:fuga)
end
上記の場合、ストロングパラメーターにrequire(:hoge)が必要となります。なぜなら、投稿するをクリックした際に送信されるparamsのhogeの中にfugaが含まれているためです。
実際に、binding.pryを使ってcreateアクション内でparamsを確認すると、以下のようになります。fugaには「例」と入力しているとします。
{"authenticity_token"=>"+wXNK4Z3C0wrq4AfslPS5zl/2LSUE6BvV+23hQpkHryrsVzPb0siDIkarIsNYLK2R502fuXlqQ==", "hoge">={"fuga"=>"例"},"commit"=>"投稿する", "controller"=>"hoges", "action"=>"create"}
##requireが必要でない場合
<%= form_with url:hoge_path, local: true do |f| %>
<%= f.text_area :fuga %>
<%= f.submit "投稿する" %>
def create
@hoge = Hoge.create(hoge_params)
end
private
def hoge_params
params.permit(:fuga)
end
上記の場合、ストロングパラメーターにrequireが必要ないです。なぜなら、投稿するをクリックした際に送信されるparamsの中にhogeが存在せず、直接fugaが含まれているためです。
実際に、binding.pryを使ってcreateアクション内でparamsを確認すると、以下のようになります。fugaには「例」と入力しているとします。
{"authenticity_token"=>"+wXNK4Z3C0wrq4AfslPS5zl/2LSUE6BvV+23hQpkHryrsVzPb0siDIkarIsNYLK2R502fuXlqQ==", "fuga"=>"例","commit"=>"投稿する", "controller"=>"hoges", "action"=>"create"}
上記の通り、先ほどと違ってhogeが存在しないことがわかります。
##まとめ
つまり、ストロングパラメーターのrequireとは、paramsの中にある入力したもの(今回の場合はfuga)をある要素(今回の場合はhoge)から引っ張り出すために使われていることがわかりました。
雑にまとめると、form_withでmodelを指定している時はrequireが必要。指定していない時はrequireが必要でないと言えると思います。