2013-07-17 5 views
4

У меня есть родительская модель с одной дочерней моделью с вложенными атрибутами. У меня есть одна форма, которая обновляет как родительский, так и дочерний.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 

Когда я сохранить форму, родительские обновления, но ребенок Безразлично» т. Что я делаю не так?

ответ

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 атрибуты тоже:

@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_name и child_name здесь, чтобы проиллюстрировать вашу потребность. Ваши атрибуты не должны совпадать с именами.

Вы также должны пройти id в методе permit как этот

child_attributes: [:id, :name] 

Или с помощью child_name

child_attributes: [:id, :child_name] 

Это не хорошо документированы в это время.

Смежные вопросы