2009-07-22 4 views

Respuesta

1

De forma predeterminada, la tarea Rake refresca todas las miniaturas. Tenga en cuenta que no tocará/procesará la imagen original.

Puede tener una clase look at the Rakefile y Attachment y modificarla para permitirle especificar un tamaño de miniatura específico, pero el diseño actual asume que desea tomar el original y volver a hacer todas las miniaturas del original.

+0

¿Y hay otra opción para recortar solo la imagen: thumb dejando a los demás en paz? Quiero decir, sin modificar la clase Attachment? ¿Tal vez algún código adicional en el modelo/controlador? – astropanic

0

Me negué esto - no es elegante, pero funcionó para mí.

Uno de sus estilos debe tener dimensiones diferentes de todos los demás estilos. De esta forma, en su procesador Paperclip personalizado, puede ver si el contenido de la cadena de comando contiene las dimensiones especificadas. Si es así, harías un procesamiento especial, si no, no lo harías.

(recorté este código - y modificar que - a partir Railscast episodio de Ryan Bate 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 

En mi situación no importaba que reprocesado en el caso que no sea especial también, ya que el resultado final no cambió nada.

18

Recientemente tuve un problema similar y encontré esta solución en un tablero de mensajes. ¡Espero eso ayude!

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

¡Gracias por la sugerencia! Parece que debes proporcionar el parámetro ': geometry' de todos modos -': cropped => {: geometry => 'whatever',: processors => [: screenshot_crop]} 'de lo contrario da' undefined method \ '[] 'for nil: NilClass'. – jibiel

1

Añadir este código a su archivo 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 

probado con Paperclip 2.3.1.1

En Paperclip 2.3.3 Esto debería ser:

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 

Es fácil, solo vaya al archivo attachment.rb en su versión de clip.

Cuestiones relacionadas