【发布时间】:2011-09-27 01:25:07
【问题描述】:
我正在使用carrierwave gem 上传文件。
我已经建立了一个系统,供用户将图像标记为不合适的图像,并让管理员删除图像。据我所知,在图像上调用 destroy 只会从表中删除路径名。
有没有办法让carrierwave真正删除文件本身?或者当我销毁图像路径时,rails应该自动删除文件吗?
【问题讨论】:
标签: ruby-on-rails ruby carrierwave
我正在使用carrierwave gem 上传文件。
我已经建立了一个系统,供用户将图像标记为不合适的图像,并让管理员删除图像。据我所知,在图像上调用 destroy 只会从表中删除路径名。
有没有办法让carrierwave真正删除文件本身?或者当我销毁图像路径时,rails应该自动删除文件吗?
【问题讨论】:
标签: ruby-on-rails ruby carrierwave
就像@mu_is_too_short 说的,你可以使用File#delete。
这是一个代码 sn-p,您可以在您的 rails 应用程序中稍作调整,将其用作助手。
def remove_file(file)
File.delete(file)
end
或者如果您只是将文件名存储在 file
中def remove_file(file)
File.delete("./path/to/#{file}")
end
【讨论】:
File.delete 将文件名作为单独的参数,并将返回删除文件数的整数。它还会对任何错误引发异常。 FileUtils.rm 接受文件名的列表或字符串,也可以传递像 :force => true 这样不会引发异常的选项。
不确定 CarrierWave 对此提供了什么,但您可以在 Ruby 标准库中使用带有 ActiveRecord 回调的 FileUtils。
例如,
require 'FileUtils'
before_destroy :remove_hard_image
def remove_hard_image
FileUtils.rm(path_to_image)
end
旁注:这段代码来自记忆。
【讨论】:
File#delete。
require 'fileutils' 如果你不想收到关于常量的各种警告。
如果想删除一个文件但不想指定完整的文件名,您可以使用下面的。
也可用于删除多个文件或具有特定扩展名的目录中的所有文件...
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
【讨论】: