我正在创建一个应用程序(个人项目),可以帮助我们安排和记录与我一起玩的团体的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很熟悉,他在其中做了一个简单的例子,但我不知道如何将锦标赛中所有这些选中的复选框弄部分,并使用这些ID从中删除这些玩家比赛。
我尝试将_tournament.html.erb
部分包装在form_tag
内,但是这样会打乱一些样式(HTML确实不允许这样做)。
任何指导或帮助都会很棒!
答案 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 attributes和fields_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