Ruby
HTML
Rails

【Rails】【check_box { multiple: true }】未選択時のデータ ["0", "0", ...]

筆者が少しハマって、おバカな回り道した話。

Railsにて、フォームでf.check_boxを利用した時のビューは以下のようになります。


.html.erb

<%= form_with url: post_path do |f| %>

 <%= f.check_box :name, "ポスト!" %>
<% end %>

コンパイル =>

<form action="/posts" method="post" data-remote="true">

<input name="name" type="hidden" value="0">      自動生成される、未選択時に送られるデータ
<input type="checkbox" value="ポスト!" name="name">
</form>

上記のように選択式リストのsubmit時に送られるデータについて、デフォルトで未選択時には"0"というデータが送られますが、


このデータが要らない!!

と思ったことのある方いませんか?

しかもmultipleでデータを送っていたので、コントローラで「params」とした時に["0", "0", "0", "0",....]と嫌がらせのようなデータを送られる。

しかし、必要なデータを含んでいる時は["0", "選択したデータ", "0",...]

もちろん選択したかを判別するために、「0」は大切なものです。

場合によって要らないよなーって話です。

解決策は簡単でした。


オプションで消せた

<%= form_with url: post_path do |f| %>

 <%= f.check_box :name, "ポスト!", {include_hidden: false} %>
<% end %>

一言で終わりました。

これで不要な0を送ることなく処理できるようになりました。

ちなみに変にハマりすぎて筆者が寄り道した結果は以下です。


ストロングパラメータで弾いてみた!?

必要なデータがあるならばそのままに、無いなら弾くように!とストロングパラメータを条件分岐させてみました。

以下に例を示します。


hogehoge_controller.rb

# params => {name: ["0", "0"], title: "title"} とする 

private

def get_params(params)
if params[:name] == ["0", "0"]
params.permit(:title)
else
params.permit(:title, name: [])
end
end


一つ注意ですが、配列型のデータをpermitする時は、最後に記述してください。

これをしないとエラーになります。


まとめ

ストロングパラメータの方法はとっても頭悪そうです。(笑)

疲れている時は思考をリセットしないとですね。

配列のストロングパラメータの設定など勉強になりましたとさ。