在编辑操作中重复 f.fields_for [英] duplicate f.fields_for in edit action
问题描述
控制器: projects_controller.rb
def new
@project = Project.new
@project.repositories.build
end
def edit
@project = Project.find(params[:id])
end
模型:project_sub_type.rb
class ProjectSubType < ActiveRecord::Base
has_many :repositories, :dependent => :destroy
accepts_nested_attributes_for :repositories
end
查看:_form.html.erb
<%= form_for @project, :html => {:class => 'project'} do |f| %>
<%= f.label :name, "Project name" %>
<%= f.text_field :name %>
<%= f.fields_for :repositories do |ff| %>
<%= ff.check_box :repos_name, {} , "svn_software", nil %> Svn Software
<% end %>
<%= f.fields_for :repositories do |ff| %>
<%= ff.check_box :repos_name, {} , "git_software", nil %> Git Software
<% end %>
<%= f.submit "Save"%>
edit.html.erb
<h2>Edit project</h2>
<%= render 'form' %>
问题:在创建过程中它会创建这样的复选框
Question: During create it creates the checkbox like this
<input type="checkbox" value="svn_software" name="project[repositories_attributes][0][repos_name]" id="project_repositories_attributes_0_repos_name">
<input type="checkbox" value="git_software" name="project[repositories_attributes][1][repos_name]" id="project_repositories_attributes_1_repos_name">
它非常适合我.但是在编辑过程中它会额外创建 2 个字段:
And it works perfectly for me. But during edit it creates 2 fields extra:
<input type="checkbox" value="svn_software" name="project[repositories_attributes][0][repos_name]" id="project_repositories_attributes_0_repos_name">
<input type="checkbox" value="svn_software" name="project[repositories_attributes][1][repos_name]" id="project_repositories_attributes_1_repos_name">
<input type="checkbox" value="git_software" name="project[repositories_attributes][2][repos_name]" id="project_repositories_attributes_2_repos_name">
<input type="checkbox" value="git_software" name="project[repositories_attributes][3][repos_name]" id="project_repositories_attributes_3_repos_name">
并创建如下隐藏字段:
<input type="hidden" value="51" name="project[repositories_attributes][0][id]" id="project_repositories_attributes_0_id">
到.. 3
谁能指出我的错误.如果我使用 1 fields_for 并通过数组循环,则存在同样的问题.
Can someone please point out my mistake. And the same problem exist if I use 1 fields_for and loop though an array.
谁能帮忙.
提前致谢
推荐答案
参考 http://apidock.com/rails/v3.2.13/ActionView/Helpers/FormHelper/fields_for
你的代码会导致重复的结果,因为给嵌套的fields_for调用的块会为集合中的每个实例重复
,所以你必须:
Your code will cause duplication result, because The block given to the nested fields_for call will be repeated for each instance in the collection
, so you have to :
<%= form_for @project, :html => {:class => 'project'} do |f| %>
<%= f.label :name, "Project name" %>
<%= f.text_field :name %>
<% @project.repositories.each do |r| %>
<%= f.fields_for :repositories, r do |ff| %>
<%= ff.check_box :repos_name, {} , r.repos_name, true %><%=r.repos_name%>
<% end %>
<% end %>
<%= f.submit "Save"%>
但是在创建时,您应该填写不包含在存储库中的复选框.所以你可以:
But when create, you should fill the check_box not include in repositories. So you could:
<%= form_for @project, :html => {:class => 'project'} do |f| %>
<%= f.label :name, "Project name" %>
<%= f.text_field :name %>
<% @project.repositories.each do |r| %>
<%= f.fields_for :repositories, r do |ff| %>
<%= ff.check_box :repos_name, {} , r.repos_name, true %><%=r.repos_name%>
<% end %>
<% end %>
<% (['svn_software','git_software'] - @project.repositories.map(& :repos_name)).each do |name| %>
<%= ff.check_box :repos_name, {} , name, nil %><%=name%>
<% end %>
<%= f.submit "Save"%>
这篇关于在编辑操作中重复 f.fields_for的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!