如何仅以嵌套形式创建field_for对象

时间:2011-07-07 17:43:04

标签: ruby-on-rails ruby-on-rails-3 nested-forms

我有一个嵌套表单,用户可以在其中创建任意数量的产品(<%= f.fields_for :products do |product| %>),同时还可以创建一个位置(nested_form_for @location)来放置这些产品。但相反,我想要的是用户选择一个位置,只允许创建产品。我不想在此表单上创建所有位置。表格也不应该为每个产品提供一个位置,而是只为所有产品提供一个位置。

您如何让表单选择一个位置并仅创建产品?

此表单同时创建产品的位置和X数量:

<%= nested_form_for @location, :validate => true  do |f| %>
      # This will turn into selecting of predefined locations and not creating
      # the location as you see below this line
    <%= f.label :business_name, "Business Name" %><br />
    <%= f.text_field :business_name %>

    <%= f.label :address %><br />
    <%= f.text_field :address %>

    <%= f.label :phone_number, "Phone Number" %><br />
    <%= f.text_field :phone_number %>

    <%= f.label :website %><br />
    <%= f.text_field :website %>
  </div>

  <%= f.fields_for :products do |product| %>
        <%= product.label :name %>:<br>
        <%= product.text_field :name %> 

        <%= product.label :price %>:<br>
        <%= product.text_field :price %>

    <%= product.link_to_remove "Remove" %> # Removes a product field

  <% end %>
  </div>
  <p><%= f.link_to_add "Add Product", :products %></p> # Ajax add product field

    <div class="actions">
       <%= f.submit %>
    </div>
<% end %>

1 个答案:

答案 0 :(得分:2)

如果我理解正确,您希望用户从位置列表中进行选择,然后将产品添加到该位置。这些位置是在您的应用程序中的某个位置预定义的(我将进入您的db_seed)。假设这两件事情,那么你答案的问题就是只有一个正常的form_for @product,在你的表格中你会得到一个select,其中选项对象就是用户可以选择的位置。

<%= form_for @product do |p| %>
    <%= p.label :name %>:<br>
    <%= p.text_field :name %> 

    <%= p.label :price %>:<br>
    <%= p.text_field :price %>

    <%= select :product, :location_id, Location.all.collect {|l| [ l.business_name, l.id ] } %>
<% end %>

在您的控制器中,您只需获取params[:product][:location_id]的位置即可检索用户所选的位置并执行正常的数据库操作。希望这对你来说足够清楚了。

如果您想一次创建多个产品,则需要使用form_tag并生成自己的帮助程序来添加/删除产品。这更难,但创造了更好的用户体验。