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