web-dev-qa-db-fra.com

Comment définir un téléchargement de fichier par programme à l'aide de Paperclip

J'ai une tâche de râteau pour semer une application avec des données aléatoires en utilisant la gemme faker. Cependant, nous avons également des images (comme des logos) que nous voulons télécharger dans cette tâche de râteau.

Nous avons déjà configuré Paperclip, mais nous n'avons aucun moyen de les télécharger par programme dans une tâche de râteau. Des idées?

67
Jaryl

Que voulez-vous dire par programmation? Vous pouvez configurer une méthode qui prendra un chemin de fichier le long des lignes de

my_model_instance = MyModel.new
file = File.open(file_path)
my_model_instance.attachment = file
file.close
my_model_instance.save!

#attachment provient de notre déclaration Paperclip dans notre modèle. Dans ce cas, notre modèle ressemble à

class MyModel < ActiveRecord::Base
  has_attached_file :attachment
end

Nous avons fait des choses similaires à cela lors du démarrage d'un projet.

139
theIV

Je fais quelque chose comme ça dans une tâche de râteau.

photo_path = './test/fixtures/files/*.jpg'
Dir.glob(photo_path).entries.each do |e|
  model = Model.find(<query here>)        
  model.attachment = File.open(e)
  model.save
end

J'espère que ça aide!

12
jonnii

Je n'avais pas vraiment besoin d'écrire une méthode pour cela. Beaucoup plus simple.

Dans le modèle ->

Class Model_Name < ActiveRecord::Base
  has_attached_file :my_attachment,
  :params_for_attachment

Dans seed.db ->

my_instance = Model_name.new
my_instance.my_attachment = File.open('path/to/file/relative/to/app')
my_instance.save!

Peut-être que les réponses précédentes signifiaient utiliser le nom de la pièce jointe tel que défini dans le modèle (plutôt que d'écrire une méthode Model_name.attachment). J'espère que c'est clair.

8
winfred