我有一个嵌套表单,用户可以在其中创建任意数量的产品(<%= 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 %>
答案 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
并生成自己的帮助程序来添加/删除产品。这更难,但创造了更好的用户体验。