Попытка собрать список идентификаторов из флажков, чтобы удалить из моей базы данных - PullRequest
0 голосов
/ 23 января 2019

Я создаю приложение (личный проект), которое поможет нам планировать и записывать турниры Nerf для группы, с которой я общаюсь. У меня есть tournament и player модели. В турнире может участвовать несколько игроков.

Я хочу иметь возможность проверить нескольких игроков и выбрать их удаление из турнира. Дело в том, что все мои игроки отображаются во вложенном фрагменте. И у моего tournament частичного уже есть форма.

Вот _tournament.html.erb:

<section class="panel" id="<%= dom_id(tournament) %>">
  <h1 class="heading">
    <%= tournament.name %>
  </h1>

  <ul>
    <%= render tournament.players %>
  </ul>

  <section class="add_players">
    <%= form_for [tournament, Player.new] do |f| %>
      <div class="form-group">
        <%= f.text_field :name %>
      </div>
      <div class="form-group">
        <%= f.text_field :team %>
      </div>
      <%= f.submit "Add Player", class="button blue" %>
    <% end %>
  </section>

  <section class="delete_all">
    <button class="button red" type="button">Delete Players</button>
  </section>
</section>

а вот _player.html.erb:

<li id="<%= dom_id(player) %>">
  <div class="player">
    <%= check_box_tag "player_ids[]", player.id %>
    <span class="name"><%= player.name %></span> |
    <span class="team"><%= player.team %></span>
  </div>
</li>

Я знаком с Railscast # 52 , где он делает более простой пример этого, но я не могу понять, как получить все эти отмеченные флажки в частичном турнире и использовать эти идентификаторы для удалить этих игроков из турнира.

Я пытался обернуть частичку _tournament.html.erb внутри form_tag, но это нарушает некоторые стили (и HTML на самом деле не допускает этого как стандарт.)

Любое руководство или помощь будут великолепны!

1 Ответ

0 голосов
/ 23 января 2019

То, что вы делаете, - это создание формы, которая публикуется на /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
...