嵌套表单不保存,因为父项不存在

Nested form doesn't save because parent doesn't exist

我有三个 类:玩家、团队和游戏

玩家组成一个团队进行比赛,每场比赛都有多个团队相互对抗。

我有一个嵌套表单,它应该使用强大的参数一次性创建球员、球队和比赛。如果我只是在创建游戏,甚至在创建游戏和团队时,这都有效。然而,一旦将玩家添加到混合中,整个事情就会失败 ActiveRecord::RecordInvalid (Validation failed: Players team must exist).

如有任何想法,我们将不胜感激。

我的模特:

class Game < ApplicationRecord
    has_many :teams
    has_many :players, through: :teams
    accepts_nested_attributes_for :teams, :players
end

class Team < ApplicationRecord
    belongs_to :game
    has_many :players
    accepts_nested_attributes_for :players
end

class Player < ApplicationRecord
    belongs_to :team
end

我的 GamesController:

class GamesController < ApplicationController

def new
        @game = Game.new
        @team = @game.teams.build
        @player = @game.players.build
    end

    def create  
        @game = Game.new(game_params)
        if @game.save
            flash[:success] = "Booking successful!"
            redirect_to root_path
        else
            render 'new'
        end
    end

    private

    def game_params
        params.require(:game).permit(:start_time, teams_attributes: [:name], players_attributes: [:first_name])
    end
end

最后,我的部分表格:

<%= form_with model: @game do |f| %>

    <%= f.fields_for :players do |f_players| %>
        <%= f_players.label :first_name %>
        <%= f_players.text_field :first_name %>
    <% end %>

    <%= f.fields_for :teams do |f_teams| %>
        <%= f_teams.label :name, "Team name" %>
        <%= f_teams.text_field :name %>
    <% end %>

    <%= f.label :start_time, "Game date" %>
    <%= f.date_field :start_time %>

    <%= f.submit "Confirm" %>
<% end %>

您正在尝试组建多支球队,每支球队有多名球员。但是,您正在尝试创建同一级别的所有玩家,因此 rails 不知道他们应该进入哪个团队。

如果我们以普通方式执行此操作,我们将创建团队并列出其中的球员。

<%= form_with model: @game do |f| %>

    <%= f.fields_for :teams do |f_teams| %>
        <%= f_teams.label :name, "Team name" %>
        <%= f_teams.text_field :name %>

      <%= f_teams.fields_for :players do |f_players| %>
        <%= f_players.label :first_name %>
        <%= f_players.text_field :first_name %>
      <% end %>
    <% end %>

    <%= f.label :start_time, "Game date" %>
    <%= f.date_field :start_time %>

    <%= f.submit "Confirm" %>
<% end %>

问题是团队和玩家都需要允许 1+ 记录。为此,您需要使用 JS 添加新团队或新玩家。 他们所连接的团队必须得到保留和验证。

您可能会发现这些文章有帮助: