Rails 6 carrierwave 批量上传文件的更新和删除

环境

  • OS: Manjaro 20.2 i3
  • Ruby: 2.6.5
  • Rails: 6.0.3.4
  • CarrierWave: 2.1.0

前言

在 CarrierWave Github 的 README 里边没有找到关于更新批量上传的文件相关的内容,也没有从多个文件中删除掉其中一个的方法。carrierwave 的默认行为是每次上传新的文件都会把原先的文件覆盖掉,而删除文件只有一个删除所有文件的方法remove_#{field_name}!。我希望能够追加新的文件,可以从中删除单个文件,谷歌没找到满意的答案,但是在Rails Admin的文档里边找到了解决方案。

下面以一个商品表的图片为例子。


上传新的图片时,追加至已有图片

class Product < ApplicationRecord
    mount_uploaders :images, ProductImageUploader

    # 追加图片
    def images=(files)
        appended = files.map do |file| 
            uploader = _mounter(:images).blank_uploader
            uploader.cache! file
            uploader
        end

        super(images + appended)
    end

end

这样一来默认的覆盖行为就会被替换为追加


从已有图片中删除

class Product < ApplicationRecord
    mount_uploaders :images, ProductImageUploader


    # 删除图片
    attr_accessor :delete_images

    after_validation do 
        uploaders = images.delete_if do |uploader|
            if Array(delete_images).include? uploader.file.filename
                uploader.remove!
                true
            end
        end

        write_attribute(:images, uploaders.map { |uploader| uploader.file.filename })
    end

    def images=(files)
        appended = files.map do |file| 
            uploader = _mounter(:images).blank_uploader
            uploader.cache! file
            uploader
        end

        super(images + appended)
    end 
end

只要把想删除的文件的文件名放在数组里边传给模型的delete_images字段即可

    product = Product.first
    product.update(delete_images: ['1.jpg', '2.jpg'])

来源

Rails Admin Carrierwave

点赞

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注