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で絞り込み用に複数のチェックボックスを作成する方法 | もっとクールにプログラミング