【发布时间】:2026-01-21 21:15:01
【问题描述】:
我发现了一个nested_attribute 的问题。
team.rb:
class Team < ApplicationRecord
has_many :players, dependent: :destroy
accepts_nested_attributes_for :players, allow_destroy: true
end
控制台输出:
Processing by TeamsController#create as JSON
Parameters: {"team"=>{"id"=>nil, "name"=>"testes",
"players_attributes"=>[{"id"=>nil, "name"=>"dadada", "_destroy"=>false, "team_id"=>nil}]}}
Unpermitted parameter: id
所以,我忽略了控制器中的 team_id 来创建并将其作为 null 发送,与 player_id 相同。获得许可后,rails 进入控制器的是:
team: {name:'testes team', players_attributes: [{ name: 'testes'}]}
在我看来(可能是我的错误)rails 应该以这种方式提供这种关系。我测试了它删除嵌套属性id 和team_id 但不起作用。
轨道返回:
bodyText: "{"players.team":["must exist"]}
控制器:
def create
@team = Team.create(team_params)
@team.players.each do |player|
player.team_id = 1
end
respond_to do |format|
if @team.save
format.html { redirect_to @team, notice: 'Team was successfully created.' }
format.json { render :show, status: :created, location: @team }
else
format.html { render :new }
format.json { render json: @team.errors, status: :unprocessable_entity }
end
end
end
def team_params
params.require(:team).permit(:name, players_attributes: [:name, :positions, :_destroy])
end
冈比亚拉:
@team.players.each do |player|
player.team_id = 1
end
如果我在保存团队之前对嵌套属性执行此操作,则团队 1 必须存在才能正常工作。如果我只保存团队并且在创建关系之后它也不起作用,只有我设置了 "gambiarra" 解决方案。
如何解决这种关系?如前所述,我的控制器仅过滤嵌套数据的属性。如果我使用 HTML 提交,工作正常,如果我使用 JSON 作为嵌套对象,除非我强制关系在保存之前为我的播放器找到 a team_id 等等,否则它不起作用,等等, rails 将保存并提交正确的播放器,就像我的播放器中没有 team_id 一样。
【问题讨论】:
-
你的意思是
"computer must exists"?另外,我不确定我是否理解您的问题,您能否说明预期的行为是什么? -
是的!确切地。我正在与团队和球员一起发展,大声笑,我的错。好吧,问题是 rails 拒绝我添加行,返回一个错误,说我应该在添加扬声器之前有一台计算机,但是这台计算机也是新的,我期待嵌套属性来提供关系。
-
你能发布你的实际代码吗?
computer/team和player/speaker之间的变化具有误导性。这样我们可以更快地发现问题。还有,material.require(:computer).permit(speaker_attributes: [:power])中的material是从哪里来的? -
我试图更好地理解重写它的问题,就像我在其他社交媒体中所做的那样,我很抱歉。我将重写所有组件的所有代码。
-
找到this的回答,看看,我想这也是你的问题。
标签: mysql ruby-on-rails json nested-attributes ruby-on-rails-5.1