如何让Carrierwave在销毁记录时删除文件?

问题描述 投票:0回答:4

我正在使用 Carrierwave gem 上传文件。

我建立了一个系统,供用户将图像标记为不适当,并供管理员删除图像。据我所知,对图像调用 destroy 只会从表中删除路径名。

有没有办法让 Carrierwave 实际上删除文件本身?或者当我销毁图像路径时,rails 应该自动删除文件吗?

ruby-on-rails ruby carrierwave
4个回答
102
投票

就像@mu_is_too_short所说,你可以使用File#delete

这是一个代码片段,您可以将其用作助手,只需在 Rails 应用程序中进行一些调整即可。

def remove_file(file)
  File.delete(file)
end

或者如果您只是将文件名存储在 file

def remove_file(file)
  File.delete("./path/to/#{file}")
end

62
投票

不确定 CarrierWave 为此提供了什么,但您可以使用 Ruby 标准库中的

FileUtils
和 ActiveRecord 回调。

举个例子,

require 'FileUtils'
before_destroy :remove_hard_image

def remove_hard_image
  FileUtils.rm(path_to_image)
end

旁注:此代码来自记忆。


1
投票

如果想删除文件但不想指定完整的文件名,您可以使用以下命令。

也可用于删除具有特定扩展名的目录中的多个文件或所有文件...

file = Rails.root.join("tmp", "foo*") 

file = Rails.root.join("tmp", ".pdf")  

files = Dir.glob(file) #will build an array of the full filepath & filename(s)
files.each do |f|
  File.delete(f)
end

© www.soinside.com 2019 - 2024. All rights reserved.