Ruby on rails Rails接受带有所属属性的嵌套属性。为什么我不能设置id?

Ruby on rails Rails接受带有所属属性的嵌套属性。为什么我不能设置id?,ruby-on-rails,ruby,activerecord,ruby-on-rails-5,Ruby On Rails,Ruby,Activerecord,Ruby On Rails 5,我使用Rails 5.1.6,在接受嵌套的属性方面遇到了问题 我有两种型号 class Material < ApplicationRecord belongs_to :rubric, optional: true accepts_nested_attributes_for :rubric end class Rubric < ApplicationRecord has_many :materials, dependent: :nullify end 但我有一个错误:

我使用Rails 5.1.6,在接受嵌套的属性方面遇到了问题

我有两种型号

class Material < ApplicationRecord
  belongs_to :rubric, optional: true
  accepts_nested_attributes_for :rubric
end

class Rubric < ApplicationRecord
  has_many :materials, dependent: :nullify
end
但我有一个错误:

 Failure/Error:
   item.assign_attributes(
     rubric_attributes: {
       id: rubric.id
     }
   )

 ActiveRecord::RecordNotFound:
   Couldn't find Rubric with ID=1 for Material with ID=1
我在更新材料时也有同样的错误

这是接受嵌套属性的可预测行为吗?我不能使用rubric属性设置现有的rubric id?

比如:

对于没有id键的每个散列,将实例化一个新记录,除非该散列还包含一个计算结果为true的_destroy键

它建议,如果您在嵌套属性中传递id,它将被视为应该更新的现有记录

说:

对于没有id键的每个散列,将实例化一个新记录,除非该散列还包含一个计算结果为true的_destroy键


它建议,如果您在嵌套属性中传递id,它将被视为应该更新的现有记录

首先,您可能不需要接受嵌套的属性

如果希望用户能够使用select选择记录,则除了创建select并将MATERY_id属性列为白名单外,实际上不需要执行任何操作:

<%= form_for(@material) do |f| %>
  <div class="field">
    <%= f.label :rubic_id %>
    <%= f.collection_select :rubic_id, Rubic.all :id, :name %>
  </div>
  <%= f.submit %>
<% end %>
接受\u嵌套的\u属性\u真正适用于需要在同一请求中创建/编辑嵌套资源的情况。您在此处使用它的唯一原因是:

用户应该能够以相同的形式创建材质。 您有一个具有附加属性(例如数量)的联接表,您希望用户能够设置这些属性。
你仍然可以做1。和上面的选择一起使用,但不能使用accepts\u nested\u attributes\u for来设置简单的归属关联。你也不想这样做,因为这就像用火箭敲打钉子一样。

你首先可能不需要接受嵌套的属性

如果希望用户能够使用select选择记录,则除了创建select并将MATERY_id属性列为白名单外,实际上不需要执行任何操作:

<%= form_for(@material) do |f| %>
  <div class="field">
    <%= f.label :rubic_id %>
    <%= f.collection_select :rubic_id, Rubic.all :id, :name %>
  </div>
  <%= f.submit %>
<% end %>
接受\u嵌套的\u属性\u真正适用于需要在同一请求中创建/编辑嵌套资源的情况。您在此处使用它的唯一原因是:

用户应该能够以相同的形式创建材质。 您有一个具有附加属性(例如数量)的联接表,您希望用户能够设置这些属性。 你仍然可以做1。和上面的选择一起使用,但不能使用accepts\u nested\u attributes\u for来设置简单的归属关联。你也不想这样做,因为这就像用火箭敲打钉子一样

class MaterialsController
  # POST /materials
  def create
    @material = Material.new(material_params)
    if @material.save
      redirect_to @material
    else
      render :new
    end
  end

  private

    def material_params
      params.require(:material)
            .permit(:foo, :bar, material_ids: [])
    end
end