问题
My accepts_nested_attributes_for only saves the parent and not the child (nested) attributes. This is many_to_many relationship between parent and child.
Problem: nothing happens and nothing is saved. But on the page, I get this message:
utf8: "\xE2\x9C\x93"
authenticity_token: 9Pjxt7e5RRgWVGafRyMoDqBSqmtj/R2zBSiVxGGxFOI=
parent: !map:ActiveSupport::HashWithIndifferentAccess
name: "Test"
gender: Male
children_attributes: !map:ActiveSupport::HashWithIndifferentAccess
"0": !map:ActiveSupport::HashWithIndifferentAccess
email: 1234@testing.com
commit: Submit
From the msg on my terminal log, I think it's because the children_attributes never got saved as it was assigned a "0"?. This is the terminal msg:
Started POST "/parents" for 127.0.0.1 at 2011-09-14 11:14:14 -0400
Processing by ParentsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"9Pjxt7e5RRgWVGafRyMoDqBSqmtj/R2zBSiVxGGxFOI=", "parent"=>{"name"=>"123", "gender"=>"Male", "children_attributes"=>{"0"=>{"email"=>"1234@testing.com"}}}, "commit"=>"Submit"}
SQL (0.1ms) BEGIN
SQL (0.6ms) SELECT 1 FROM `children` WHERE (LOWER(`children`.`email`) = LOWER('1234@testing.com')) LIMIT 1
SQL (0.2ms) ROLLBACK
Controller-
def new
@parent = Parent.new
@parent.children.build
end
def create
@parent = Parent.new(params[:parent])
if @parent.save
redirect_to root_path
else
render 'new'
end
end
Parent model -
attr_accessible :children_attributes
has_many :children, :through => :parent_child_relationships
accepts_nested_attributes_for :children
Child model -
has_many :parents, :through => :parent_child_relationships
validates :email, :name, :presence => true
Parent form view -
<%= form_for(@parent, new_parent_path) do |f| %>
<div>
<%= f.label(:name) %></br>
<%= f.text_field(:name) %>
</div>
<div>
<%= f.label(:gender) %> <br/>
<%= f.select(:gender, ['Male', 'Female']) %>
</div>
<%= f.fields_for :children do |ff| %>
<div>
<%= ff.label(:email)%></br>
<%= ff.text_field(:email)%>
</div>
<% end %>
<%= submit_tag "Submit" %>
<% end %>
Any help would be greatly appreciated! Thank you!
回答1:
Can you change your validations on child model to :
validates :name, :presence => true
validates :email, :presence => true, :email => true
And see if that fixes it for you?
回答2:
Check if there are any unsuccessful validations for the children model
You can validate on create, using something like below
validates_uniqueness_of :xxxx, :on => :create
来源:https://stackoverflow.com/questions/7418901/accepts-nested-attributes-for-not-saving-the-child-attribute-to-the-database