Ruby On 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

评论