55 votes

Comment faire en sorte que carrierwave supprime le fichier lors de la suppression d'un enregistrement ?

Je suis en train d'utiliser la gem carrierwave pour télécharger des fichiers.

J'ai mis en place un système permettant aux utilisateurs de signaler des images comme inappropriées et aux administrateurs de les supprimer. De ce que je comprends, en appelant destroy sur l'image, seul le chemin du fichier sera supprimé de la table.

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

102voto

oconn Points 142

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 quelques ajustements dans votre application rails.

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

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

def remove_file(file)
  File.delete("./chemin/vers/#{file}")

7 votes

Quelle est la différence entre File#delete et FileUtils.rm?

5 votes

Dans la version 2.2.2, il semble que File.delete prendra le(s) nom(s) de fichier(s) en tant qu'arguments individuels et renverra un entier représentant le nombre de fichiers supprimés. Il soulèvera également une exception en cas d'erreur. FileUtils.rm prend une liste, ou une chaîne de caractères, de noms de fichiers et peut également recevoir des options comme :force => true qui nèveront pas une exception.

62voto

basicxman Points 1382

Je ne suis pas sûr de ce que CarrierWave offre pour cela, mais vous pourriez utiliser FileUtils dans la bibliothèque standard Ruby avec un callback ActiveRecord.

Par exemple,

require 'FileUtils'
before_destroy :remove_hard_image

def remove_hard_image
  FileUtils.rm(path_to_image)
end

Remarque : Ce code est de mémoire.

29 votes

Il y a aussi File#delete dans les classes de base.

3 votes

require 'fileutils' si vous ne souhaitez pas recevoir toutes sortes d'avertissements concernant les constantes.

0 votes

Utiliser une gem pour quelque chose d'aussi simple que cela, surtout lorsque la stdlib offre déjà cette fonction, semble inutile. +1 pour File#delete

1voto

orion Points 156

Si l'on souhaite supprimer un fichier sans spécifier le nom complet, vous pouvez utiliser ce qui suit.

Peut également être utilisé pour supprimer plusieurs fichiers ou tous les fichiers dans 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) #va construire un tableau du chemin complet et du nom du(des) fichier(s)
files.each do |f|
  File.delete(f)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X