嵌套表单不保存,因为父项不存在
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 添加新团队或新玩家。
他们所连接的团队必须得到保留和验证。
您可能会发现这些文章有帮助:
我有三个 类:玩家、团队和游戏。
玩家组成一个团队进行比赛,每场比赛都有多个团队相互对抗。
我有一个嵌套表单,它应该使用强大的参数一次性创建球员、球队和比赛。如果我只是在创建游戏,甚至在创建游戏和团队时,这都有效。然而,一旦将玩家添加到混合中,整个事情就会失败 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 添加新团队或新玩家。 他们所连接的团队必须得到保留和验证。
您可能会发现这些文章有帮助: