Ruby on rails Rails接受带有所属属性的嵌套属性。为什么我不能设置id?
我使用Rails 5.1.6,在接受嵌套的属性方面遇到了问题 我有两种型号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 但我有一个错误:
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