Question

Anciennement: Exécution d'une méthode de modèle sur une pièce jointe après paperclip créer ou mettre à jour (callbacks Paperclip ne semblent pas au travail)

Modifier (plus tard ce jour-là) Je me suis dit à mon problème. Le processeur fonctionne apparemment avec le fichier qui est mis à jour, mais ne sauvegarde pas les fichiers qu'après traitement. J'ai changé :: Zip ZipFile à « fichier » ouvert plutôt que « attachment.path » puisque le chemin de fixation ne tient pas en fait encore rien. Ce rapport a fixé le premier problème. Maintenant, je vais avoir d'autres problèmes que je vais avoir besoin de traquer. Mais la réponse ci-dessous est la plupart du temps correct.

Edit (31/01/2011):

J'ai donc pris les conseils pour créer un processeur pour mon attachement qui exécutera toutes les actions nécessaires. Jusqu'à présent, il semble que cela devrait fonctionner; le processeur démarre et fait tous les trucs d'initialisation, apparemment. Cependant, quand je suis au point où je veux accéder au fichier zip qui obtient téléchargé, je reçois une erreur disant que le fichier ne peut pas être trouvé. Le code pour mon processeur est ci-dessous:

class Extractor < Processor
    attr_accessor :resolution, :whiny
    def initialize(file, options = {}, attachment = nil)
      super
      @file = file
      @whiny = options[:whiny].nil? ? true : options[:whiny]
      @basename = File.basename(@file.path, File.extname(@file.path))
      @attachment = attachment
      @instance = attachment.instance
    end
    def make
      # do your conversions here, you've got @file, @attachment and @basename to work with
      export_path = attachment.path.gsub('.zip', '_content')

      Zip::ZipFile.open(attachment.path) { |zip_file|
        zip_file.each { |image|
          image_path = File.join(export_path, image.name)
          FileUtils.mkdir_p(File.dirname(image_path))
          unless File.exist?(image_path)
            zip_file.extract(image, image_path)
            # ..stuff that it does..
          end
        }
      }
      # clean up source files, but leave the zip
      FileUtils.remove_dir(export_path)


      # you return a file handle which is the processed result
      dst = File.open result_file_path
    end
end

Et voici le contenu de l'erreur que je reçois:

Zip::ZipError in GalleriesController#create

File /home/joshua/railscamp/moments_on_three/public/assets/archives/delrosario.zip not found

Rails.root: /home/joshua/railscamp/moments_on_three
Application Trace | Framework Trace | Full Trace

config/initializers/extractor.rb:16:in `make'
app/controllers/galleries_controller.rb:32:in `new'
app/controllers/galleries_controller.rb:32:in `create'

Request

Parameters:

{"utf8"=>"✓",
 "authenticity_token"=>"0s4L4MrlqjDTMjzjgkUdvUxeHklZNOIShDhT6fgOICY=",
 "gallery"=>{"name"=>"DelRosario",
 "public"=>"0",
 "owner_id"=>"1",
 "shoot_date(1i)"=>"2011",
 "shoot_date(2i)"=>"1",
 "shoot_date(3i)"=>"31",
 "category_id"=>"1",
 "archive"=>#<ActionDispatch::Http::UploadedFile:0x00000004148d78 @original_filename="delrosario.zip",
 @content_type="application/zip",
 @headers="Content-Disposition: form-data; name=\"gallery[archive]\"; filename=\"delrosario.zip\"\r\nContent-Type: application/zip\r\n",
 @tempfile=#<File:/tmp/RackMultipart20110131-9745-14u347v>>},
 "commit"=>"Create Gallery"}

D'après ce que je peux dire qu'il cherche le fichier au bon endroit, mais le fichier ne semble pas être encore téléchargé pour y accéder. Pour autant que je sache, Paperclip est assez intelligent pour savoir et d'attendre la pièce jointe à télécharger avant d'essayer de traiter. Quelqu'un peut-il place ce que je fais mal ici?

Merci beaucoup.

vieux trucs:

Je développe une galerie photo en utilisant l'application Rails 3 et Paperclip. L'administrateur est en mesure de créer une galerie et télécharger un fichier zip contenant un tas d'images.

Ce que je veux arriver:

  1. Entrez dans la galerie d'informations et zip fichier à télécharger dans le formulaire.
  2. Hit 'Créer Gallery' bouton.
  3. Formulaire de messages, galerie enregistre et zip fichier est téléchargé.
  4. Une fois le fichier zip téléchargé, exécutez la méthode: extract_photos (BTW, ce code travaux). 4.a. A la fin de cette méthode, fichier zip est détruit.
  5. Admin est redirigé vers la page de la galerie avec toutes les photos qu'il contient (où galerie de photos de has_many).

J'ai essayé de faire ce travail de plusieurs façons différentes.

Avant, je créé une méthode de commande qui permettrait à l'administrateur de cliquer sur un lien qui a couru la méthode: extract_photos. Cela a fonctionné sur mon ordinateur, mais pour une raison quelconque avait du mal à acheminer cela sur l'ordinateur du client au serveur. Il est donc un aller pas. De plus, je pensais que c'était une façon laide de le faire.

Récemment, j'ai essayé d'utiliser des méthodes de rappel. after_save n'a pas fonctionné parce qu'il interrompt apparemment la forme POST et le fichier ne soit pas téléchargé et le:. extract_photos méthode ne peut pas trouver le fichier

J'ai vérifié les méthodes de rappel sur la page GitHub Paperclip, et il parle des callbacks:

Avant et après le traitement post étape, Paperclip rappelle à la modèle avec quelques callbacks, ce qui permet le modèle de modification ou d'annulation l'étape de traitement. Les callbacks sont « Before_post_process » et « After_post_process » (qui sont appelés avant et après le traitement de chaque pièce jointe), et le fixation spécifique « Beforepost_process » et "Afterpost_process". Les callbacks sont destiné à être aussi proche de la normale ActiveRecord possible Demandes de rappel, donc si vous revenez faux (en particulier - retour nul n'est pas le même) dans un en amont du filtre, le traitement post étape arrêter. De retour dans un faux après filtre n'arrêtera pas quoi que ce soit, mais vous pouvez accéder au modèle et la pièce jointe si nécessaire.

J'ai essayé d'utiliser before_post_process et after_post_process, mais il ne peut pas trouver le fichier pour exécuter le processus, de sorte que le fichier est évidemment pas se téléchargé au moment où ces méthodes sont appelées se (qui je pense est étrange). De plus, lorsque je tente beforepost_processet afterpost_process, je reçois un NoMethodError.

Alors, comment dois-je appeler une méthode sur une pièce jointe lorsqu'il est créé ou mis à jour, mais une fois le fichier téléchargé et au bon endroit?

UPDATE

J'ai essayé le code ci-dessous, pour mettre mon code de la méthode d'extraction dans la méthode de faire du processeur. Je suis devenu plus loin que je l'ai fait avant d'essayer d'écrire un processeur, mais il est encore un non-droit. Le processus lance une exception, dès que je tente et ouvrez le fichier téléchargé pour le traitement, indiquant que le fichier n'existe pas. Le schéma de nommage est correct et tout, mais toujours rien ne se téléchargé avant que le processus est déclenché se. Est-ce que quelqu'un a une idée pourquoi cela se passe?

Était-ce utile?

La solution

Vous pouvez écrire votre propre processeur pour accomplir cette tâche.

dans votre modèle lors de la déclaration du stuff ajouter un processeur paperclip personnalisé

  has_attached_file :my_attachment, {
    :styles => {:original => {:processors => [:my_processor]}}
  }.merge(PAPERCLIP_SETTINGS)

puis écrire votre propre processeur et mettre config / initializers:

module Paperclip
  class MyProcessor < Processor
    attr_accessor :resolution, :whiny
    def initialize(file, options = {}, attachment = nil)
      super
      @file = file
      @whiny = options[:whiny].nil? ? true : options[:whiny]
      @basename = File.basename(@file.path, File.extname(@file.path))
      @attachment = attachment
    end
    def make
      # do your conversions here, you've got @file, @attachment and @basename to work with

      # you return a file handle which is the processed result
      dst = File.open result_file_path
    end
  end
end

J'utilise un processeur personnalisé à des choses semblables à ce que vous faites avec beaucoup de traitement et de conversion du fichier au milieu et il semble bien fonctionner.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top