【问题标题】:How to upload multiple files with carrierwave and create multiple records如何使用carrierwave上传多个文件并创建多个记录
【发布时间】:2019-12-18 09:57:35
【问题描述】:

我正在尝试修改我的图片上传例程,以便同时上传多张图片。目前我可以上传多张图片,但它只会创建一条记录。如何实现一次提交创建多条记录?

我不想通过关联,而是能够直接上传多张图片。

我目前有一个模型:

class Diapo < ApplicationRecord
  belongs_to :album
  mount_uploaders :file_name, DiapoUploader
end

我的控制器:

class Admin::DiaposController < ApplicationController

  def new
    @diapo = Diapo.new
    @page_title = 'Create new Diapo'
  end

  def create
    @diapo = Diapo.new(diapo_params)
    if @diapo.save
      flash[:notice] = 'Diapo #{@diapo.file_name} was successfully created.
      redirect_to action: :index
    else
      @page_title = 'Create new Diapo'
      render action: :new
    end
  end

.
.
.

  private

  def diapo_params
    params.require(:diapo).permit({file_name: []}, :title, :alt, :author, :copyright, :album_id)
  end
end

按照我的形式:

<%= f.file_field :file_name, multiple: true, class: 'form-field' %>

目前我收到一个帖子

Started POST "/admin/diapos" for ::1 at 2019-12-18 10:45:19 +0100
Processing by Admin::DiaposController#create as HTML
  Parameters: {"authenticity_token"=>"something==", "diapo"=>{"file_name"=>[#<ActionDispatch::Http::UploadedFile:0x00007f9062b51a40 @tempfile=#<Tempfile:/var/folders/yg/pfjwzpkx5wq9d27svk760h0h0000gn/T/RackMultipart20191218-2329-7kffxo.jpg>, @original_filename="1.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"diapo[file_name][]\"; filename=\"1.jpg\"\r\nContent-Type: image/jpeg\r\n">, #<ActionDispatch::Http::UploadedFile:0x00007f9062b519f0 @tempfile=#<Tempfile:/var/folders/yg/pfjwzpkx5wq9d27svk760h0h0000gn/T/RackMultipart20191218-2329-o5qzhe.jpg>, @original_filename="2.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"diapo[file_name][]\"; filename=\"2.jpg\"\r\nContent-Type: image/jpeg\r\n">], "alt"=>"Test", "author_ids"=>"", "album_id"=>"124", "copyright"=>"Test"}, "commit"=>"Save"}
  Admin Load (0.4ms)  SELECT 'admins'.* FROM 'admins' WHERE 'admins'.'id' = 1 ORDER BY 'admins'.'id' ASC LIMIT 1
Unpermitted parameter: :author_ids
(0.2ms)  BEGIN
  ↳ app/controllers/admin/diapos_controller.rb:14:in `create'
  Album Load (0.3ms)  SELECT `albums`.* FROM `albums` WHERE `albums`.`id` = 124 LIMIT 1
  ↳ app/controllers/admin/diapos_controller.rb:14:in `create'
  Diapo Create (0.2ms)  INSERT INTO `diapos` (`file_name`, `alt`, `copyright`, `album_id`, `created_at`, `updated_at`) VALUES ('[\"1.jpg\", \"2.jpg\"]', 'Test', 'Test', 124, '2019-12-18 09:45:34.406410', '2019-12-18 09:45:34.406410')
  ↳ app/controllers/admin/diapos_controller.rb:14:in `create'
   (6.5ms)  COMMIT
  ↳ app/controllers/admin/diapos_controller.rb:14:in `create'
Redirected to http://localhost:3000/admin/diapos
Completed 302 Found in 15350ms (ActiveRecord: 7.5ms | Allocations: 75512)

并创建了 1 条记录,该记录在文件名字段中包含文件名数组。

我怀疑我可以在控制器中或通过 javascript 做到这一点?我该怎么做?

提前谢谢你!

【问题讨论】:

    标签: ruby-on-rails carrierwave


    【解决方案1】:

    您必须使用 has_many 关系来实现您的要求。 要保存多条记录,您可能具有如下所示的父子关系。

    例如:- Post 是一个父表,并将其图像保存为 post_attachments 子表

    class Post < ActiveRecord::Base
     has_many :post_attachments
     accepts_nested_attributes_for :post_attachments
    end
    
    class PostAttachment < ActiveRecord::Base
       mount_uploader :avatar, AvatarUploader
       belongs_to :post
    end
    

    这是为父记录保存多个文件的方法

    有关更多详细信息,请参阅此Article,这可能对您有所帮助。

    https://kolosek.com/carrierwave-upload-multiple-images/

    【讨论】:

    • 感谢@code_aks 我知道 has_many 选项,但我正在寻找能够在没有 has_many 的情况下实现相同目标的东西。我只有图片,上传之前没有帖子或类似的东西。也许是一个循环创建的自定义控制器操作?
    • 以上只是一个示例,您可以以比任何循环或 javascript 更容易的方式满足您的要求。 :)
    • 亲爱的 code_aks 我几乎可以正常工作,但我无法将多个属性写入nested_form。你能看看吗? stackoverflow.com/q/59414743/4779531谢谢
    • 当然,我可能会在晚上的某个时间尝试。 :)
    猜你喜欢
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 2015-05-12
    相关资源
    最近更新 更多