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'])
评论