2009-07-22 2 views

Odpowiedz

1

Domyślnie zadanie Rake odświeża wszystkie miniatury. Pamiętaj, że nie dotknie/nie przetworzy oryginalnego obrazu.

Możesz mieć klasę look at the Rakefile i Attachment i modyfikować, aby umożliwić określenie określonego rozmiaru miniatury, ale obecny projekt zakłada, że ​​chcesz wziąć oryginał i ponowić wszystkie miniatury z oryginału.

+0

A czy istnieje inna opcja, aby przyciąć tylko: obraz kciuka pozostawiając innych w spokoju? Mam na myśli bez modyfikowania klasy Attachment? Może jakiś dodatkowy kod w modelu/kontroler? – astropanic

0

Kludowałem to - to nie jest eleganckie, ale zadziałało.

Jeden z twoich stylów powinien mieć wymiary inne niż wszystkie pozostałe style. W ten sposób w swoim niestandardowym procesorze spinacza można sprawdzić, czy zawartość ciągu poleceń zawiera podane wymiary. Jeśli tak, to zrobiłbyś specjalne przetwarzanie, jeśli nie, nie zrobiłbyś tego.

(I obcięty ten kod - i zmodyfikowała go - od Ryana BATE Railscast Odcinek 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 

w mojej sytuacji nie miało to znaczenia, że ​​przetworzony w szczególnym przypadku nie zbyt, ponieważ wynik końcowy niczego nie zmienił.

18

Niedawno miałem podobny problem i znalazłem to rozwiązanie na tablicy ogłoszeń. Mam nadzieję, że to pomoże!

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

Dzięki za napiwek! Wydaje się, że powinieneś podać parametr ': geometry' mimo to -': cropped => {: geometry => 'whatever',: processors => [: screenshot_crop]} 'w przeciwnym wypadku daje' niezdefiniowaną metodę \ '[] 'dla zero: NilClass'. – jibiel

1

Dodaj ten kod do pliku 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 

Testowane z spinacza 2.3.1.1

W spinacza 2.3.3 powinno być:

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 

To proste, wystarczy przejść do pliku attachment.rb w wersji spinacza.