如何停止使用已添加记录复制的fields_for嵌套表单?

时间:2011-07-24 09:29:34

标签: ruby-on-rails build nested nested-forms fields-for

我有一个场地表,我在场地编辑页面上使用嵌套表格为每个场地添加优惠。但是,每次添加新商品时,fields_for表单都会保存输入的文本,并为要添加的其他商品记录创建新的空白表单。

我只想要一个'添加新优惠'表单,而不是每个添加的记录。

没有添加任何优惠 - 这很好: enter image description here

添加了一项优惠 - 现在theres 2'添加新优惠'表单和不需要的空白优惠部分:

enter image description here

添加一个优惠之后,这就是我想要的样子: enter image description here

新的空白报价表格和空白部分的数量随着控制器中内置的数字的变化而变化(在1分钟时)

场地管制员

class VenuesController < ApplicationController   
  def edit
    @venue = Venue.find(params[:id])
    1.times { @venue.offers.build }
  end

  def update
    @venue = Venue.find(params[:id])
    if @venue.update_attributes(params[:venue])
      flash[:notice] = 'Venue updated successfully'
      redirect_to :back
    end
  end
end

场地模型

class Venue < ActiveRecord::Base
  has_many :offers
  accepts_nested_attributes_for :offers
end

场地edit.html.erb

      <%= form_for @venue do |f| %>

        <h2 class="venue_show_orange">Offers</h2>

        <div class="edit_venue_details">
          <% if @venue.offers.count.zero? %>
            <div class="no_offers">
              No offers added yet.
            </div>
          <% else %>
            <%= render :partial => 'offers/offer', :collection => @venue.offers %>
          <% end %>

          <div class="clearall"></div>

          <h2 class="edit_venue_sub_header">Add a new offer</h2>    

          <%= f.fields_for :offers do |offer| %>
            <p class="edit_venue">title: <br>
            <%= offer.text_field :title, :class => "edit_venue_input" %></p>
          <% end %>
        </div>

        <button class="submit_button" type="submit"> Save changes</button>
      <% end %>

那么我怎样才能在场地编辑页面上添加一个新的优惠表格,这样我就可以添加一个新的优惠,然后填写表格以便再次使用?另外,有没有办法阻止创建空白报价部分?

非常感谢任何帮助,非常感谢!

2 个答案:

答案 0 :(得分:7)

class VenuesController < ApplicationController   
  def edit
    @venue = Venue.find(params[:id])
  end
  ...
end

场地edit.html.erb

<%= f.fields_for :offers, @venue.offers.build do |offer| %>
  <p class="edit_venue">title: <br>
  <%= offer.text_field :title, :class => "edit_venue_input" %></p>
<% end %>

答案 1 :(得分:0)

我不确定这是否有效,但您是否尝试过以下操作?

<%= f.fields_for @venue.offers.last do |offer| %>

我认为问题在于您传递了符号:offers,这会导致字段为所有商品创建字段,但您应该只能将特定对象传递给fields_for方法。