巢狀模型 - 多次上傳

如果要建立多個上載,你可能要做的第一件事是建立新模型並設定關係

假設你想要產品型號的多個影象。建立一個新模型,並使其成為你的父模型

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 %>