2

私は基本的に 5 ページの販売フォームである非常に野獣なフォームを持っていますが、新しいフォームを作成するときはすべて問題ありません。しかし、新しいフォームを編集しようとすると、フィールドと値が 4 回、場合によっては 7 回複製されます。編集アクションがどのように機能しているのかさえわかりません。新しいアクションが使用するのと同じフォーム部分を使用します。しかし、これが new アクションと edit アクションのコントローラー アクションです。

また、重複はすべてのフィールドで発生するわけではなく、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

レールの経験が豊富な人がその動作を知っていることを期待して、編集アクションで追加のフィールドが生成される理由がわかりません。

ありがとう!

編集:

これは、各ルビ ブロックが 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 %>

最終更新:

わかりましたので、1 つの汎用ブロックを使用して DB をループする編集用の別のフォームを作成する必要がありました。これは私がコンポーネントのために持っているものです

  <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>
4

2 に答える 2

7

Reference親オブジェクトを作成すると、複数の取引の詳細を作成しているように見えます。デフォルトでは、has_manyリレーションシップで fields_for ヘルパーが使用されると、子のインスタンスごとに fields_for ブロックが 1 回繰り返されます (この場合は「deal_detail」)。

正しいインスタンスのみを表示するには、deal_detail インスタンスが保存されていると仮定して、このように fields_for にインスタンスを追加するだけです。@my_deal_detail

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

「has_many」の下のfields_for のドキュメントに詳細があります

于 2012-05-24T03:51:45.773 に答える
2

このようなフォームを作成する際に、formtasticまたはを調べますsimple_form。サブモデルを使用してフォームを管理するのに役立つフックがいくつかあります。

現在行っていることを継続したいとします。私の推測では、deal_detailsは関係ではhas_oneないはずですhas_many

于 2012-05-23T21:21:47.850 に答える