嵌套模型 - 多次上传
如果要创建多个上载,你可能要做的第一件事是创建新模型并设置关系
假设你想要产品型号的多个图像。创建一个新模型,并使其成为你的父模型
rails g model ProductPhoto
#product.rb
has_many :product_photos, dependent: :destroy
accepts_nested_attributes_for :product_photos
#product_photo.rb
belongs_to :product
mount_uploader :image_url, ProductPhotoUploader # make sure to include uploader (Carrierwave example)
accepts_nested_attributes_for 是必须的,因为它允许我们创建嵌套表单,因此我们可以从单个表单上传新文件,更改产品名称和设置价格
接下来,在视图中创建表单(编辑/创建)
<%= form_for @product, html: { multipart: true } do |product|%>
<%= product.text_field :price # just normal type of field %>
<%= product.fields_for :product_photos do |photo| # nested fields %>
<%= photo.file_field :image, :multiple => true, name: "product_photos[image_url][]" %>
<% end %>
<%= p.submit "Update", class: "btn" %>
<% end %>
控制器并不特别,如果你不想创建新控制器,只需在产品控制器中创建一个新控制器即可
# create an action
def upload_file
printer = Product.find_by_id(params[:id])
@product_photo = printer.prodcut_photos.create(photo_params)
end
# strong params
private
def photo_params
params.require(:product_photos).permit(:image)
end
显示视图中的所有图像
<% @product.product_photos.each do |i| %>
<%= image_tag i.image.url, class: 'img-rounded' %>
<% end %>