web-dev-qa-db-fra.com

Comment faire pour que carrierwave supprime le fichier lors de la destruction d'un enregistrement?

J'utilise la gemme carrierwave pour télécharger des fichiers.

J'ai créé un système permettant aux utilisateurs de signaler les images comme inappropriées et aux administrateurs de supprimer les images. D'après ce que je peux dire, appeler destroy sur l'image ne supprimera que le nom du chemin de la table.

Existe-t-il un moyen pour que carrierwave supprime réellement le fichier lui-même? Ou devrait Rails supprimer automatiquement le fichier lorsque je détruis le chemin de l'image?

55
Oakland510

Vous ne savez pas ce que CarrierWave propose pour cela, mais vous pouvez utiliser FileUtils dans la bibliothèque standard Ruby avec un rappel ActiveRecord).

Par exemple,

require 'FileUtils'
before_destroy :remove_hard_image

def remove_hard_image
  FileUtils.rm(path_to_image)
end

Sidenote: Ce code est de mémoire.

62
basicxman

Comme l'a dit @mu_is_too_short, vous pouvez utiliser File # delete.

Voici un extrait de code que vous pourriez utiliser comme aide avec un petit ajustement dans votre application Rails.

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

ou si vous avez juste le nom de fichier stocké dans le fichier

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

Si l'on veut supprimer un fichier mais ne veut pas spécifier le nom de fichier complet, vous pouvez utiliser le ci-dessous.

Peut également être utilisé pour supprimer de nombreux fichiers ou tous les fichiers d'un répertoire avec une extension spécifique ...

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

ou

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
1
orion