Как заставить carrierwave удалять файл при уничтожении записи? - PullRequest
55 голосов
/ 02 июля 2011

Я использую драгоценный камень carrierwave для загрузки файлов.

Я создал систему, позволяющую пользователям отмечать изображения как неподходящие, а администраторам - удалять изображения.Из того, что я могу сказать, вызов уничтожения на изображении приведет к удалению только пути из таблицы.

Есть ли способ сделать, чтобы carrierwave действительно удалила сам файл?Или рельсы должны автоматически удалять файл, когда я уничтожаю путь к изображению?

Ответы [ 3 ]

101 голосов
/ 07 февраля 2014

Как сказал @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 голосов
/ 02 июля 2011

Не уверен, что CarrierWave предлагает для этого, но вы можете использовать FileUtils в стандартной библиотеке Ruby с обратным вызовом ActiveRecord.

Например,

require 'FileUtils'
before_destroy :remove_hard_image

def remove_hard_image
  FileUtils.rm(path_to_image)
end

Sidenote: этот кодпо памяти.

1 голос
/ 20 сентября 2016

Если вы хотите удалить файл, но не хотите указывать полное имя файла, вы можете использовать ниже.

Может также использоваться для удаления многих файлов или всех файлов в каталоге с определенным расширением ...

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
...