Rails 4 - 使用嵌套属性保存对象

Flo*_*amp 4 ruby-on-rails-4

我有一个父模型,它有一个具有嵌套属性的子模型.我有一个表单可以更新父级和子级.

这是我的模特:

class Parent < ActiveRecord::Base
  has_one :child
  accepts_nested_attributes_for :child
end

class Child < ActiveRecord::Base
  belongs_to :parent
end
Run Code Online (Sandbox Code Playgroud)

表格视图:

<%= 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 %>
Run Code Online (Sandbox Code Playgroud)

家长控制器:

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
Run Code Online (Sandbox Code Playgroud)

当我保存表单时,父级更新但子级没有.我究竟做错了什么?

phr*_*ron 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 %>
Run Code Online (Sandbox Code Playgroud)

您还必须在params属性中传递id:

@parent.update(params.require(:parent).permit(:parent_name, child_attributes: [:id, :child_name]))
Run Code Online (Sandbox Code Playgroud)

干杯