Rails 4 - saving an object with nested attributes

I have a parent model that has one child model with nested attributes. I have one form that updates both parent and child.

Here are my models:

class Parent < ActiveRecord::Base has_one :child accepts_nested_attributes_for :child end class Child < ActiveRecord::Base belongs_to :parent end 

Type of form:

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

Parent controller:

 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 

When I save the form, the parent updates, but the child does not. What am I doing wrong?

+4
source share
2 answers

You have a problem in the nested part of the form code, this should be

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

You must also pass the identifier in the params attributes:

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

Greetings

+7
source

In your controller

 class ParentsController < ApplicationController def edit @parent = Parent.find(params[:id]) @child = @parent.child.build end end 

In your opinion

 <%= form_for @parent, do |f| %> <%= f.text_field :name %> <%= f.fields_for @child do |builder| %> <%= builder.text_field :name %> <% end %> <%= f.submit "Save" %> <% end %> 

Assuming parent_name and child_name were here to illustrate your needs. Your attributes should not be positioned like this.

You also need to pass id in a permit method like this

 child_attributes: [:id, :name] 

Or using child_name

 child_attributes: [:id, :child_name] 

This is currently not well documented.

+2
source

Source: https://habr.com/ru/post/1491984/


All Articles