2013-07-17 112 views
4

我有了嵌套屬性的一個子模型中的父模型。我有一個更新父母和孩子的單一表單。軌道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 

當我保存表單,父更新,但孩子沒有按」噸。我究竟做錯了什麼?

回答

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

你必須通過ID在PARAMS屬性太:

@parent.update(params.require(:parent).permit(:parent_name, child_attributes: [:id, :child_name])) 

乾杯

+1

工作,謝謝!爲什麼我必須使用符號而不是對象? – FloorLamp

+0

長的有點解釋,但看看這裏http://rubymonk.com/learning/books/4-ruby-primer-ascent/chapters/45-more-classes/lessons/110-instance-variables,這裏HTTP: //stackoverflow.com/questions/7211724/ruby-difference-between-variable-and-variable。 – phron

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在這裏說明您的需求。您的屬性不應該像這樣間隔名稱。

您也可以通過idpermit方法這樣

child_attributes: [:id, :name] 

或者使用child_name

child_attributes: [:id, :child_name] 

這不是很好此時記錄。