То, что вы делаете, - это создание формы, которая публикуется на /tournaments/:tournament_id/players
, что имеет смысл, если вы назначаете игроков одного за другим или создаете одного игрока.
Это не имеет никакого смысла, если вы назначаете нескольких игроков на турнир. Потому что вы на самом деле меняете родительский ресурс.
В этом случае вы должны отправлять запрос POST на /tournaments
(для создания турнира) или запрос PATCH на /tournaments/:id
(для изменения существующей записи).
<%= form_for tournament do |f| %>
<div class="form-group">
<%= f.label :player_ids, "Assign players" %>
<%= f.collection_check_boxes :player_ids, Player.all, :id, :name %>
</div>
<%= f.submit %>
<% end %>
class TournamentsController < ApplicationController
# ...
private
def tournament_params
params.require(:tournament)
.permit(:foo, :bar, player_ids: [])
end
end
Если вы хотите иметь возможность создавать несколько записей игроков в одном запросе, вы должны использовать вложенные атрибуты и fields_for .
Чтобы отменить назначение всех игроков, вы можете сделать запрос PATCH на /tournaments/:id
с пустым массивом в качестве значения для tournaments[:players_ids]
. Это можно сделать с помощью javascript, создав обработчик, который снимает все флажки и отправляет форму, когда пользователь нажимает кнопку (или подтверждает ее).
Или вы можете создать пользовательский DELETE /tournaments/:tournament_id/players
маршрут .
resources :tournaments do
resources :players
delete :players, on: :collection, action: :delete_all_players
end