Rails4 複数のチェックボックスの入力結果を配列で取得すると、不要な"0"が含まれる

ユーザーをグループ分けするときに、そのグループに所属するユーザーをチェックボックスで選択したい。

複数のチェックボックスの入力結果を処理するときに、不要な"0"が取得できてしまったので、メモ。

まずは、ビューでチェックボックスを実装

<% @users.each do |user| %>
  <%= f.check_box :user_id, {:name => "grouping[user_id][]"}, user.id %>
  <%= f.label :user_id, user.name, :value => user.id %>
  <br>
<% end %>   

すると、HTMLは次のようになった

<input name="grouping[user_id][]" type="hidden" value="0" />
<input id="grouping_user_id" name="grouping[user_id][]" type="checkbox" value="1" />
<label for="grouping_user_id_1">ユーザー1</label>
<br>
<input name="grouping[user_id][]" type="hidden" value="0" />
<input id="grouping_user_id" name="grouping[user_id][]" type="checkbox" value="2" />
<label for="grouping_user_id_2">ユーザー2</label>
<br>
<input name="grouping[user_id][]" type="hidden" value="0" />
<input id="grouping_user_id" name="grouping[user_id][]" type="checkbox" value="3" />
<label for="grouping_user_id_3">ユーザー3</label>
<br>

意図しない

<input name="grouping[user_id][]" type="hidden" value="0" />

が追加されている。

チェックボックスでユーザー1を選択してsubmitすると、params[:grouping][:user_id]には["0","1","0","0"]と、不要な"0"が入っていた。
この"0"は未選択時のためにあるようですが、あると処理がしにくいので、コントローラで削除する必要があります。


コントローラで"0"を削除

params[:grouping][:user_id].delete("0")

すると、params[:grouping][:user_id]は、["1"]になった。


ついでに、文字列の配列を数値の配列に変換し、処理しやすくした。

user_ids = params[:grouping][:user_id].map{|s|s.to_i}


参考:
プログラマの覚書: Rails チェックボックスの配列化(修正)
Ruby on Railsで絞り込み用に複数のチェックボックスを作成する方法 | もっとクールにプログラミング