问题描述
我的accepts_nested_attributes_for仅保存父属性,而不保存子(嵌套)属性.这是父母与子女之间的many_to_many关系.
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: [email protected]
commit: Submit
从我的终端日志中的味精中,我认为这是因为children_attributes从未被保存,因为它被分配了"0"?这是终端信息:
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"=>"[email protected]"}}}, "commit"=>"Submit"}
SQL (0.1ms) BEGIN
SQL (0.6ms) SELECT 1 FROM `children` WHERE (LOWER(`children`.`email`) = LOWER('[email protected]')) LIMIT 1
SQL (0.2ms) ROLLBACK
控制器-
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
父模型-
attr_accessible :children_attributes
has_many :children, :through => :parent_child_relationships
accepts_nested_attributes_for :children
子模型-
has_many :parents, :through => :parent_child_relationships
validates :email, :name, :presence => true
父表单视图-
<%= 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!
推荐答案
检查子模型是否存在任何不成功的验证
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
这篇关于accepts_nested_attributes_for不将child属性保存到数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!