Domanda

In precedenza: Esecuzione di un metodo di modello su un attacco graffetta dopo creare o aggiornare (callback graffetta non sembrano lavoro)

Modifica (più tardi quel giorno) Ho capito il mio problema. Il processore a quanto pare funziona con il file che viene aggiornato, ma non salva i file fino a dopo l'elaborazione. Ho cambiato il mio Zip :: ZipFile a 'file' aperta piuttosto che 'attachment.path' poiché il percorso di attacco in realtà non tenere ancora nulla. Questo risolto il primo problema. Ora sto avendo altri problemi che avrò bisogno di rintracciare. Ma la risposta di seguito è per lo più corretta.

Modifica (2011/01/31):

Così ho preso il consiglio per creare un processore per il mio attaccamento che eseguirà tutte le azioni necessarie. Finora, sembra che dovrebbe funzionare; il processore inizia e fa tutte le cose di inizializzazione, a quanto pare. Tuttavia, quando arrivo al punto in cui voglio accedere al file zip che viene caricato, ottengo un errore che dice che il file non può essere trovato. Il codice per il mio processore è qui sotto:

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

E qui è il contenuto del l'errore che ottengo:

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"}

Da quello che posso dire che sta cercando il file nel posto giusto, ma il file non sembra essere ancora aggiunto per accedervi. Per quanto io sappia, Paperclip è abbastanza intelligente per sapere e di attesa per il fissaggio a caricare prima che tenta di elaborare essa. Qualcuno può posto quello che sto facendo male qui?

Grazie mille.

Roba vecchia:

sto sviluppando una foto gallery applicazione utilizzando Rails 3 e Paperclip. L'amministratore è in grado di creare una galleria e caricare un file zip contenente una serie di immagini.

Quello che voglio che accada:

  1. Inserisci le informazioni galleria e zip file da caricare nel modulo.
  2. Hit 'Crea galleria' pulsante.
  3. messaggi Form, galleria salva, e il file zip viene caricato.
  4. Dopo aver file zip viene caricato, eseguire il metodo: extract_photos (btw, questo codice lavori). 4.a. Alla fine di questo metodo, zip file viene distrutta.
  5. Admin viene reindirizzato alla pagina della galleria con tutte le foto in esso (dove fotos galleria has_many).

Ho provato a fare questo lavoro diversi modi.

Prima, ho creato un metodo di controllo che consenta all'amministratore di clic su un collegamento che si è svolta il metodo: extract_photos. Questo ha lavorato sul mio computer, ma per qualche motivo il server aveva problemi di routing presente sul computer del cliente. Quindi è un no go. Inoltre ho pensato che fosse un modo brutto di farlo.

Di recente, ho provato ad utilizzare i metodi di callback. after_save non ha funzionato perché a quanto pare interrompe il modulo POST e il file non viene caricato e la:. Metodo extract_photos non riesce a trovare il file

Ho controllato metodi di callback nella pagina GitHub Paperclip, e si parla di callback:

Prima e dopo il post processing passo, Paperclip richiama alla modello con un paio di callback, permettendo il modello di modificare o annullare la fase di lavorazione. I callback sono "Before_post_process" e "After_post_process" (che sono chiamati prima e dopo l'elaborazione di ciascun allegato), e allegato specifico "Beforepost_process" e "Afterpost_process". I callback sono destinato ad essere il più vicino alla normalità ActiveRecord callback possibile, in modo se si torna falso (in particolare - il ritorno a zero non è lo stesso) in una prima del filtro, la post-elaborazione passo si arresterà. Tornando falso in un dopo filtro non fermerà niente, ma è possibile accedere al modello e la allegato se necessario.

Ho provato con before_post_process e after_post_process, ma non riesce a trovare il file per eseguire il processo, quindi il file, ovviamente, non è sempre caricato per il momento quei metodi sono sempre chiamati (che credo sia strano). Inoltre, quando provo beforepost_processe afterpost_process, ho un NoMethodError.

Quindi, come faccio a chiamare un metodo su un allegato quando viene creato o aggiornato, ma dopo che il file è stato caricato e nel posto giusto?

Aggiorna

ho provato il codice qui sotto, muovendo l'estrazione codice metodo nel metodo marca del processore. Ho ottenuto più di quanto abbia fatto prima con il tentativo di scrivere un processore, ma è ancora un no-go. Il processo genera un'eccezione non appena cerco di aprire il file caricato per l'elaborazione, dice che il file non esiste. Lo schema di denominazione è corretta e tutto, ma ancora non è sempre caricato prima che il processo è sempre attivato. Qualcuno ha qualche idea del perché questo sta accadendo?

È stato utile?

Soluzione

È possibile scrivere il proprio processore per raggiungere questo obiettivo.

nel modello quando si dichiara la roba graffetta aggiungere un processore personalizzato

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

quindi scrivere il proprio processore e metterlo config / inizializzatori:

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

Sto usando un processore personalizzato per cose simili a quello che si sta facendo con un sacco di elaborazione e la conversione del file in mezzo e sembra funzionare bene.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top