How to make carrierwave delete the file when destroying a record?

瘦欲@ 提交于 2019-12-18 01:19:15

问题


I'm using the carrierwave gem to upload files.

I have built a system for users to flag images as inappropriate and for admins to remove the images. From what I can tell, calling destroy on the image will only remove the path name from the table.

Is there a way to have carrierwave actually remove the file itself? Or should rails automatically remove the file when I destroy the image path?


回答1:


Not sure what CarrierWave offers for this, but you could use FileUtils in the Ruby standard library with an ActiveRecord callback.

For instance,

require 'FileUtils'
before_destroy :remove_hard_image

def remove_hard_image
  FileUtils.rm(path_to_image)
end

Sidenote: This code is from memory.




回答2:


Like @mu_is_too_short said, you can use File#delete.

Here's a code snippet you could use as a helper with a little tweaking in your rails app.

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

or if you just have the filename stored in file

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



回答3:


If one wants to delete a file but does not want to specify the full filename you can use the below.

Can also be used to delete many files or all files in a directory with a specific extension...

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

or

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


来源:https://stackoverflow.com/questions/6553392/how-to-make-carrierwave-delete-the-file-when-destroying-a-record

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!