我有一个父模型,它有一个带嵌套属性的子模型。我有一个表格可以更新父母和孩子。
以下是我的模特:
class Parent < ActiveRecord::Base
has_one :child
accepts_nested_attributes_for :child
end
class Child < ActiveRecord::Base
belongs_to :parent
end
表单视图:
<%= form_for @parent, do |f| %>
<%= f.text_field :parent_name %>
<%= f.fields_for @parent.child do |c| %>
<%= c.text_field :child_name %>
<% end %>
<%= f.submit "Save" %>
<% end %>
家长控制器:
class ParentsController < ApplicationController
def update
@parent = Parent.find(params[:id])
@parent.update(params.require(:parent).permit(:parent_name, child_attributes: [:child_name]))
redirect_to @parent
end
end
当我保存表单时,父级更新但子级没有。我做错了什么?
答案 0 :(得分:7)
您在表单代码的嵌套部分遇到问题,应该是
<%= form_for @parent, do |f| %>
<%= f.text_field :parent_name %>
<%= f.fields_for :child do |c| %> <<<<<<<<<<< this line was wrong
<%= c.text_field :child_name %>
<% end %>
<%= f.submit "Save" %>
<% end %>
你也必须在params属性中传递id:
@parent.update(params.require(:parent).permit(:parent_name, child_attributes: [:id, :child_name]))
干杯
答案 1 :(得分:2)
在您的控制器中
class ParentsController < ApplicationController
def edit
@parent = Parent.find(params[:id])
@child = @parent.child.build
end
end
在您的视图中
<%= form_for @parent, do |f| %>
<%= f.text_field :name %>
<%= f.fields_for @child do |builder| %>
<%= builder.text_field :name %>
<% end %>
<%= f.submit "Save" %>
<% end %>
假设parent_name
和child_name
来说明您的需求。你的属性不应该是这样的名称间隔。
您还必须像{/ 1>这样的id
方法传递permit
child_attributes: [:id, :name]
或使用child_name
child_attributes: [:id, :child_name]
目前尚无法详细记录。