尝试从复选框中收集ID列表以从我的数据库中删除

时间:2019-01-23 15:37:18

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord partials

我正在创建一个应用程序(个人项目),可以帮助我们安排和记录与我一起玩的团体的Nerf锦标赛。我有tournamentplayer模型。一个锦标赛可以有多个玩家。

我希望能够检查多个玩家并选择将其从锦标赛中删除。事实是,我所有的玩家都被嵌套在一个局部中。我的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很熟悉,他在其中做了一个简单的例子,但我不知道如何将锦标赛中所有这些选中的复选框弄部分,并使用这些ID从中删除这些玩家比赛。

我尝试将_tournament.html.erb部分包装在form_tag内,但是这样会打乱一些样式(HTML确实不允许这样做)。

任何指导或帮助都会很棒!

1 个答案:

答案 0 :(得分:1)

您正在做的是创建一个发布到/tournaments/:tournament_id/players的表单,如果您是逐个分配玩家或创建一个玩家,这很有意义。

如果您要分配多个玩家参加锦标赛,那根本就没有意义。因为您实际上是在更改父资源。

在这种情况下,您应该向/tournaments发送POST请求(以创建比赛)或向/tournaments/:id发送PATCH请求(以修改现有记录)。

<%= 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

如果您希望能够在单个请求中创建多个玩家记录,则应使用nested attributesfields_for

要取消分配所有玩家,您可以向/tournaments/:id发出PATCH请求 使用空数组作为tournaments[:players_ids]的值。您可以使用javascript通过创建一个处理程序来做到这一点,该处理程序取消选中所有复选框,并在用户单击按钮(或确认按钮)时提交表单。

或者您可以创建一个custom DELETE /tournaments/:tournament_id/players route

resources :tournaments do
  resources :players
  delete :players, on: :collection, action: :delete_all_players
end