如何在销毁记录时使carrierwave删除文件?

Oak*_*510 55 ruby ruby-on-rails carrierwave

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

我已经构建了一个系统,供用户将图像标记为不合适,并且管理员可以删除图像.据我所知,在图像上调用destroy只会从表中删除路径名.

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

oco*_*onn 102

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

这是一个代码片段,您可以将其用作帮助程序,并在rails应用程序中进行一些调整.

def remove_file(file)
  File.delete(file)
end
Run Code Online (Sandbox Code Playgroud)

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

def remove_file(file)
  File.delete("./path/to/#{file}")
end
Run Code Online (Sandbox Code Playgroud)

  • File#delete和FileUtils.rm有什么区别? (7认同)
  • 在2.2.2中,它看起来像`File.delete`将文件名作为单独的参数,并将返回删除的文件数的整数.它还会引发任何错误的异常.`FileUtils.rm`获取文件名的列表或字符串,也可以传递像`:force => true`这样的选项,它不会引发异常. (5认同)

bas*_*man 62

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

例如,

require 'FileUtils'
before_destroy :remove_hard_image

def remove_hard_image
  FileUtils.rm(path_to_image)
end
Run Code Online (Sandbox Code Playgroud)

旁注:此代码来自内存.

  • 核心条款中还有[`File#delete`](http://ruby-doc.org/core/classes/File.html#M000018). (29认同)
  • 如果你不想得到关于常数的各种警告,请'require'fileutils'. (3认同)