nil, "name"=>"testes", "players_attributes"=>[{-6ren">
gpt4 book ai didi

mysql - JSON Rails 一对多的嵌套属性

转载 作者:行者123 更新时间:2023-11-29 06:58:58 25 4
gpt4 key购买 nike

我正在解决nested_attribute的问题。

团队.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

因此,我忽略了 Controller 中的 team_id 来创建并将其作为 null 发送给 player_id。获得许可后,rails 进入 Controller 的内容是:

team: {name:'testes team', players_attributes: [{ name: 'testes'}]}

在我看来(可能是我的错误)rails 应该以这种方式提供这种关系。我测试了它删除嵌套属性 idteam_id 但不起作用。

rails 返回:

bodyText: "{"players.team":["must exist"]}

Controller :

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”解决方案时。

如何解决这个关系?如前所述,我的 Controller 仅过滤嵌套数据的属性。如果我使用 HTML 提交,工作正常,如果我使用 JSON 作为嵌套对象,则它不起作用,除非我在保存之前强制该关系为我的玩家找到a team_id 依此类推,rails 将保存并提交正确的播放器,就像我的播放器中没有 team_id 时所预期的那样。

最佳答案

您发送的参数结构不正确,rails 需要这样的内容才能使用嵌套属性:

{
"computer": {
"speakers_attributes": {
"0": {
"power": "1"
}
}
}
}

注意三件事:

  1. computer: null 已删除;您无需指定 computer 属性,因为其值将使用要创建的新计算机的 id 进行设置。

  2. 添加了
  3. “0”:;由于 has_many :speakers 关联,您可以创建多个 Speaker (您将使用 1: { ... }, 2: { ... } 等)。

  4. speaker: 更改为 speakers_attributes;这就是 Rails 识别嵌套属性值的方式。

既然参数已经正确设置,您还需要做两件事:

  1. 确认您的关联设置正确

    class Computer < ApplicationRecord
    has_many :speakers, dependent: :destroy
    accepts_nested_attributes_for :speakers, allow_destroy: true
    end

    class Speaker < ApplicationRecord
    belongs_to :computer
    end
  2. 正确设置您的 Controller

    class ComputersController < ApplicationController
    def new
    @computer = Computer.new
    @computer.speakers.build
    end

    def create
    @computer = Computer.create(computer_params)

    if @computer.save
    # handle success
    else
    # handle error
    end
    end

    # other actions

    private
    def computer_params
    params.require(:computer).permit(speakers_attributes: [:power])
    end
    end

仅当您要使用表单助手创建嵌套表单时,才需要这里 @computer.speakers.build

关于mysql - JSON Rails 一对多的嵌套属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44320028/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com