我有两个型号,Product和ProductImage,我想为每个产品添加最多6张图像。
产品
has_many :product_images, :dependent => :destroy
而ProductImage
belongs_to :product
到目前为止,我的观点如下:
#products/_form.html.erb.
<% @product.product_images.build %>
<%= form_for(@product, :html => { :multipart => true }) do |product_form| %>
<% if @product.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@product.errors.count, "error") %> prohibited this product from being saved:</h2>
<ul>
<% @product.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= product_form.label :title %><br />
<%= product_form.text_field :title %>
</div>
<div class="field">
<%= product_form.label :description %><br />
<%= product_form.text_area :description %>
</div>
<div class="field">
<%= product_form.label :price %><br />
<%= product_form.text_field :price %>
</div>
<div id="product_images">
<%= render :partial => 'product_images/form', :locals => {:form => product_form} %>
</div>
<div class="actions">
<%= product_form.submit %>
</div>
<% end %>
和
#product_images/_form.html.erb
<%= form.fields_for :product_images do |product_image_form| %>
<div class="image">
<%= product_image_form.label :image, 'Image:' %>
<%= product_image_form.file_field :image %>
</div>
<% unless product_image_form.object.nil? || product_image_form.object.new_record? %>
<div class="image">
<%= product_image_form.label :_destroy, 'Remove:' %>
<%= product_image_form.check_box :_destroy %>
</div>
<% end %>
<% end %>
问题是:如何强制我的部分表格打印出6个不同的file_fields,每个file_fields都有自己独特的属性名称,例如:
name="product[product_images_attributes][0][image]"
name="product[product_images_attributes][1][image]"
等等?
我的意思是,是否有可能或者有更好的和不同的方式来实现这样的结果?
我想我可以使用link_to和AJAX添加任意数量的字段,但我想用户可以更轻松地打印出六个字段并准备就绪,而不是每次都点击链接以添加字段。
答案 0 :(得分:2)
假设您在产品型号中使用accepts_nested_attributes_for :product_images
,则需要在ProdcutsController中使用以下内容:
def new
@product = Product.new
6.times { @product.product_images.build } # this will create 6 "blank product_images"
end
def edit
@product = Product.find(params[:id]).includes(:product_images)
(6 - @product.product_images.size).times { @product.product_images.build } # this will create as many "blanks" as needed
end
对于新产品,您build
6个新产品图片,对于现有产品build
,只需要您拥有6个产品图片。
修改:同时从您的products / _form.html.erb视图中删除<% @product.product_images.build %>
行,因为您build
代替了控制器中的关联实例。