55

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

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

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

4

3 回答 3

102

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

这是一个代码片段,您可以在 Rails 应用程序中稍作调整,将其用作助手。

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

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

def remove_file(file)
  File.delete("./path/to/#{file}")
end
于 2014-02-06T22:39:59.900 回答
62

不确定 CarrierWave 对此提供了什么,但您可以FileUtils在 Ruby 标准库中使用 ActiveRecord 回调。

例如,

require 'FileUtils'
before_destroy :remove_hard_image

def remove_hard_image
  FileUtils.rm(path_to_image)
end

旁注:此代码来自内存。

于 2011-07-01T21:31:07.740 回答
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
于 2016-09-20T03:08:11.380 回答