belongs_to 嵌套形式的关联 post 数据不正确
belongs_to association in nested form does not post data correctly
我很难弄清楚为什么表单中的 post 数据没有 post 正确编辑。
我必须建模:Child 和 Parent
以 Child 的形式,我以这种方式嵌套 Parent 的形式:
<%
parent = (child.parent) ? parent : Parent.new
%>
<%=f.fields_for :parent, parent do |builder| %>
<%= render 'parent_fields', :fp => builder %>
<% end %>
parent_fields形式如下:
<% @all_parents = Parent.all %>
<% parent = fp.object %>
<%= fp.fields_for :parent do |builder| %>
<%= builder.input :parent_id, :as => :select, :label => 'Parent: ', :required => false,
:collection => options_from_collection_for_select(@all_parents, "id", "name", parent.id), :include_blank => '- Select -' %>
<% end %>
posted数据哈希显示如下:
"parent_attributes"=>{"parent"=>{"parent_id"=>"6"}, "id"=>"36"}
其中 36 是旧的 parent id,6 是新的。
当我执行 update_attributes 时,它不起作用,这是正常的,因为如果散列是这样的话它会起作用:
...
"parent_id" => 6
"parent_attributes"=>{"id"=>"36", ....}
...
我正在处理遗留代码。也有可能数据被 javascript 修改了。 post 的目的是确保我编写表单的方式是正确的,因为我是嵌套表单的新手。
谢谢
您要考虑两种可能的情况:
1、一个child需要select一个已有的parent它所属。
2. 一个child需要创建一个属于它的全新parent
您似乎想要执行 #1,select 一个现有的 parent。如果是这样,则不需要 fields_for
。用于创建新关系的字段。
我将向您展示我正在开发的一个关于学校的应用程序的示例代码,其中学生 belongs_to
一个年级。
app/views/students/_form.html.erb
<%= form_for @student do |student_form| %>
<%= student_form.text_field :first %>
<%= student_form.text_field :last %>
<%= student_form.collection_select :grade_level_id, GradeLevel.all, :id, :name %>
<%= student_form.submit "Save" %>
<% end %>
现在,使用您的模型(Child 和 Parent):
app/views/children/_form.html.erb
<%= form_for @child do |form| %>
<%= form.text_field :child_name %>
<%= form.number_field :age %>
<%= form.collection_select :parent_id, Parent.all, :id, :name %>
<%= form.submit "Save" %>
<% end %>
请注意,我只是将 Parent.all
直接放入 collection_select
。没有必要在上面创建 @all_parents
。
编辑
如果您想每次都创建新的 parents...
app/views/children/_form.html.erb
<%= form_for @child do |form| %>
<%= form.text_field :child_name %>
<%= form.number_field :age %>
<% form.fields_for :parent, @child.parent do |parent_fields| %>
<%= parent_fields.text_field :parent_name %>
<%= form.submit "Save" %>
<% end %>
我很难弄清楚为什么表单中的 post 数据没有 post 正确编辑。
我必须建模:Child 和 Parent
以 Child 的形式,我以这种方式嵌套 Parent 的形式:
<%
parent = (child.parent) ? parent : Parent.new
%>
<%=f.fields_for :parent, parent do |builder| %>
<%= render 'parent_fields', :fp => builder %>
<% end %>
parent_fields形式如下:
<% @all_parents = Parent.all %>
<% parent = fp.object %>
<%= fp.fields_for :parent do |builder| %>
<%= builder.input :parent_id, :as => :select, :label => 'Parent: ', :required => false,
:collection => options_from_collection_for_select(@all_parents, "id", "name", parent.id), :include_blank => '- Select -' %>
<% end %>
posted数据哈希显示如下:
"parent_attributes"=>{"parent"=>{"parent_id"=>"6"}, "id"=>"36"}
其中 36 是旧的 parent id,6 是新的。
当我执行 update_attributes 时,它不起作用,这是正常的,因为如果散列是这样的话它会起作用:
...
"parent_id" => 6
"parent_attributes"=>{"id"=>"36", ....}
...
我正在处理遗留代码。也有可能数据被 javascript 修改了。 post 的目的是确保我编写表单的方式是正确的,因为我是嵌套表单的新手。
谢谢
您要考虑两种可能的情况: 1、一个child需要select一个已有的parent它所属。 2. 一个child需要创建一个属于它的全新parent
您似乎想要执行 #1,select 一个现有的 parent。如果是这样,则不需要 fields_for
。用于创建新关系的字段。
我将向您展示我正在开发的一个关于学校的应用程序的示例代码,其中学生 belongs_to
一个年级。
app/views/students/_form.html.erb
<%= form_for @student do |student_form| %>
<%= student_form.text_field :first %>
<%= student_form.text_field :last %>
<%= student_form.collection_select :grade_level_id, GradeLevel.all, :id, :name %>
<%= student_form.submit "Save" %>
<% end %>
现在,使用您的模型(Child 和 Parent):
app/views/children/_form.html.erb
<%= form_for @child do |form| %>
<%= form.text_field :child_name %>
<%= form.number_field :age %>
<%= form.collection_select :parent_id, Parent.all, :id, :name %>
<%= form.submit "Save" %>
<% end %>
请注意,我只是将 Parent.all
直接放入 collection_select
。没有必要在上面创建 @all_parents
。
编辑
如果您想每次都创建新的 parents...
app/views/children/_form.html.erb
<%= form_for @child do |form| %>
<%= form.text_field :child_name %>
<%= form.number_field :age %>
<% form.fields_for :parent, @child.parent do |parent_fields| %>
<%= parent_fields.text_field :parent_name %>
<%= form.submit "Save" %>
<% end %>