在编辑操作中重复 f.fields_for [英] duplicate f.fields_for in edit action

查看:30
本文介绍了在编辑操作中重复 f.fields_for的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

控制器: 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆