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

时间:2013-07-17 23:54:01

标签: 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

表单视图:

<%= 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

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

2 个答案:

答案 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_namechild_name来说明您的需求。你的属性不应该是这样的名称间隔。

您还必须像{/ 1>这样的id方法传递permit

child_attributes: [:id, :name]

或使用child_name

child_attributes: [:id, :child_name]

目前尚无法详细记录。