Ruby on Rails fields_for在编辑操作上生成太多字段



我有一个非常野兽的表单,本质上是一个五页的销售表单,在创建新表单时一切都很好。但是,当您编辑新表单时,它会复制字段和值四次,有时重复 7 次。我不知道编辑操作是如何工作的,它使用与新操作相同的部分形式。但这是我对新操作和编辑操作的控制器操作。

此外,并非每个字段都会发生重复,似乎只发生在存在has_many关系的部分。

  # GET /references/new
  # GET /references/new.json
  def new
    @reference = Reference.new
    @user_id = params[:user_id]
    @reference.build_customer_overview
    @reference.build_solution_description
    @reference.solution_description.deal_details.build
    component = @reference.components.build
    component.servers.build
    component.services.build
    partner = @reference.build_partner
    partner.competitors.build
    partner.contacts.build
    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @reference }
    end
  end
  # GET /references/1/edit
  def edit
    @reference = Reference.find(params[:id])
    @user_id = @reference.user_id
  end

我只是不知道为什么它会在编辑操作上生成额外的字段,希望有更多 rails 经验的人知道这种行为。

谢谢!

编辑:

这是表单的一部分,每个红宝石块渲染 4 次。

  <%= f.fields_for :deal_details do |ff| %>
    <div>
      <%= ff.label :title, 'Customer's business/IT needs (why was this solution required)' %>
      <%= ff.hidden_field :title, value: 'business/IT needs' %>
      <br />
      <%= ff.text_area :content %>
    </div>
  <% end %>
  <%= f.fields_for :deal_details do |ff| %>
    <div>
      <%= ff.label :title, 'Description of solution: (including product/services information)' %>
      <%= ff.hidden_field :title, value: 'Description of solution' %>
      <br />
      <%= ff.text_area :content %>
    </div>
  <% end %>
  <%= f.fields_for :deal_details do |ff| %>
    <div>
      <%= ff.label :title, 'Measurable anticipated benefits to the client and/or it's end customers: (i.e. this does NOT mean "benefits to")' %>
      <%= ff.hidden_field :title, value: 'Measurable benefits' %>
      <br />
      <%= ff.text_area :content %>
    </div>
  <% end %>
  <%= f.fields_for :deal_details do |ff| %>
    <div>
      <%= ff.label :title, 'Why won? (and why any competitors failed)' %>
      <%= ff.hidden_field :title, value: 'Why won?' %>
      <br />
      <%= ff.text_area :content %>
    </div>
  <% end %>

最后更新:

好的,所以我需要制作一个单独的编辑表单,该表单使用一个通用块来循环访问数据库。 这是我对组件的

  <fieldset>
    <% title = f.object.component_title %>
    <h3><%= f.object.component_title %></h3>
    <%= f.fields_for :servers do |fff| %>
        <% if title == 'psg' %>
          <%= render 'psg_fields', f: fff %>
        <% end %>
        <% if title == 'servers' %>
          <%= render 'server_fields', f: fff %>
        <% end %>
        <% if title == 'storage' %>
          <%= render 'storage_fields', f: fff %>
        <% end %>
        <% if title == 'ipg' %>
          <%= render 'ipg_fields', f: fff %>
        <% end %>
        <% if title == 'software' %>
          <%= render 'software_fields', f: fff %>
        <% end %>
        <% if title == 'services' %>
          <%= render 'service_fields', f: fff %>
        <% end %>
        <% if title == 'financial' %>
          <%= render 'financial_fields', f: fff %>
        <% end %>
    <% end %>
    <%= link_to_add_fields "Add Server", f, :servers, :servers %>
  </fieldset>

当您创建父对象Reference时,您正在创建多个交易详细信息。 默认情况下,当fields_for帮助程序用于has_many关系时,它将对子实例的每个实例重复一次fields_for块(在本例中为"deal_detail")。

要仅显示正确的实例,只需像这样将您的实例添加到fields_for,假设您有一个deal_detail实例保存到@my_deal_detail

<%= f.fields_for :deal_details, @my_deal_detail do |ff| %>

文档中有更多信息,fields_for在"has_many"下

在制作这样的表单时,我会研究formtasticsimple_form,它们有一些钩子来帮助管理带有子模型的表单。

假设你想继续你目前正在做的事情。我的猜测是,deal_details应该是has_one而不是has_many关系

相关内容

  • 没有找到相关文章

最新更新