2009-07-22 2 views

risposta

1

Per impostazione predefinita, l'attività Rake aggiorna tutte le miniature. Tieni presente che non toccherà/elaborerà l'immagine originale.

È possibile avere una classe look at the Rakefile e Attachment e modificare per consentire di specificare una dimensione di anteprima specifica, ma il progetto corrente presuppone che si desidera prendere l'originale e ripetere tutte le miniature dall'originale.

+0

E c'è un'altra opzione per ritagliare solo: l'immagine del pollice lascia solo gli altri? Intendo senza modificare la classe Allegato? Forse qualche codice in più nel modello/controller? – astropanic

0

Ho ammesso che non è elegante, ma ha funzionato per me.

Uno dei tuoi stili deve avere dimensioni diverse da tutti gli altri stili. In questo modo, nel tuo Paperclip Processor personalizzato, puoi vedere se il contenuto della stringa di comando contiene le dimensioni specificate. Se così fosse, dovresti fare un'elaborazione speciale, altrimenti non lo faresti.

(I ritagliato questo codice - e modificato - da Ryan Bate Railscast episodio 182.)

module Paperclip 
    class Cropper < Thumbnail 
    def transformation_command 
     SPECIAL_PROCESSING_FLAG = "150x150" 
     if crop_command && super.include?(SPECIAL_PROCESSING_FLAG) 
     crop_command + super.sub(/ -crop \S+/, '') 
     else 
     super 'do nothing fancy 
     end 
    end 

    def crop_command 
     target = @attachment.instance 
     if target.cropping? 
     " -crop '#{target.crop_w.to_i}x#{target.crop_h.to_i}+#{target.crop_x.to_i}+#{target.crop_y.to_i}'" 
     end 
    end 
    end 
end 

Nella mia situazione non aveva importanza che noi rielaborati nel caso non troppo speciale, dal momento che il risultato finale non ha cambiato nulla.

18

Recentemente ho riscontrato un problema simile e ho trovato questa soluzione su una bacheca. Spero che sia d'aiuto!

has_attached_file :screenshot, 
:default_style => :full, 
:styles => { 
    :full => "280x210", 
    :cropped => { :processors => [:screenshot_crop] } 
} 
+0

Grazie per il suggerimento! Sembra che dovresti fornire comunque il parametro ': geometry' -': cropped => {: geometry => 'whatever',: processors => [: screenshot_crop]} 'altrimenti restituisce' metodo indefinito \ '[] 'per nil: NilClass'. – jibiel

1

Aggiungere questo codice al file paperclip.rake:

desc "Reprocesses your attachments style (set CLASS, ATTACHMENT and STYLE)" 
    task :style => :environment do 
     module JustForOneDay 
     NAME = ENV['STYLE'] 
     end 

     module ::Paperclip 
     class Attachment 
      def post_process_styles #:nodoc: 
      @styles.each do |name, args| 
       if JustForOneDay::NAME == name 
       begin 
        raise RuntimeError.new("Style #{name} has no processors defined.") if args[:processors].blank? 
        @queued_for_write[name] = args[:processors].inject(@queued_for_write[:original]) do |file, processor| 
        Paperclip.processor(processor).make(file, args, self) 
        end 
       rescue PaperclipError => e 
        log("An error was received while processing: #{e.inspect}") 
        (@errors[:processing] ||= []) << e.message if @whiny 
       end 
       end 
      end 
      end 
     end 
     end 

     for_all_attachments do |instance, name| 
     result = instance.send(name).reprocess! 
     end 
    end 
    end 

Testato con il Paperclip 2.3.1.1

In Paperclip 2.3.3 questo dovrebbe essere:

def post_process_styles #:nodoc: 
    styles.each do |name, style| 
    if JustForOneDay::NAME == name 
    begin 
     raise RuntimeError.new("Style #{name} has no processors defined.") if style.processors.blank? 
     @queued_for_write[name] = style.processors.inject(@queued_for_write[:original]) do |file, processor| 
     Paperclip.processor(processor).make(file, style.processor_options, self) 
     end 
    rescue PaperclipError => e 
     log("An error was received while processing: #{e.inspect}") 
     (@errors[:processing] ||= []) << e.message if @whiny 
    end 
    end 
    end 
end 

È facile, basta andare al file attachment.rb nella versione paperclip.