10.lines do: Trucos para paperclip

12.10.2009 0

Paperclip es un plugin para Ruby on Rails que, debido a su potencia y sencillez, ha conseguido ser la elección de la mayoría de los desarrolladores a la hora de implementar de manera sencilla una solución a la hora de tener ficheros adjuntos a un modelo. Además está muy bien documentada tanto en su wiki como en los RDoc.

El ejemplo más básico de uso de paperclip sería el siguiente:

class User < ActiveRecord::Base
  has_attached_file :avatar
end

Aparte de facilitarnos la vida a la hora de la subida de ficheros, mediante su integración con ImageMagick nos permite poder generar todas las miniaturas que necesitemos de una imagen dada:

has_attached_file :image,
  :styles => { :normal => ["610x610>", :jpg], :mini => ["100x100#", :jpg] },
  :convert_options => { :all => "-strip" },
  :path => ":rails_root/public/images/articles/:id/:style.:extension",
  :url => "/images/articles/:id/:style.:extension"

En este ejemplo estamos definiendo que, para el atributo image de nuestro modelo generaremos dos miniaturas: normal, cuyo tamaño será nunca superior a 610 de ancho o de alto (lo que primero suceda) y un tamaño mini, el cual será una imagen a 100×100 px haciendo crop y en caso de que la imagen sea más ancha que alta o viceversa. Además, para ambas miniaturas se quitarán todos los datos extra de la imagen (como el EXIF) para asegurarnos de que generaremos el menor tamaño posible de imagen (más opciones para los estilos o la conversión en la documentación de ImageMagick.

Desde nuestras vistas para hacer referencia al estilo mini no tendríamos más que hacer algo como lo siguiente:

<%= image_tag article.image.url(:mini) %>

En los parámetros :path y :url vemos que se hacen uso de etiquetas del estilo :id, :style o :rails_root. Es lo que dentro de Paperclip se conoce como interpolaciones, y que a la hora de su uso se sustituyen sobre la marcha por el dato que corresponda (:style se sustituiría por "mini", basándonos en el ejemplo anterior).

Una de las opciones más interesantes, aunque quizá de las menos usadas por la gente, son la posibilidad de definir nuestras propias interpolaciones. Por ejemplo, podríamos definir una interpolación de nombre :username, incluyendo el siguiente código en el fichero config/initializers/paperclip.rb:

Paperclip.interpolates :username do |attachment, style|
  attachment.instance.username
end

El anterior código define que :username será sustituida por el atributo username de la instancia del modelo desde el que estemos usando Paperclip. De esta manera, si hiciesemos algo como lo siguiente:

class User < ActiveRecord::Base
  has_attached_file :avatar, :path => ":rails_root/public/images/:username.:extension"
end

Como resultado, al llamar a user.avatar.path tendríamos "./public/images/mayoral.png". Pensad por ejemplo en el uso de permalink_fu y una interpolación que hiciese referencia al campo que alberga el permalink de un artículo… :P

En mi caso, otra línea que suele estar frecuentemente en config/initializers/paperclip.rb es la siguiente:

Paperclip.options[:command_path] = '/opt/local/bin'

De esta manera le indico a Paperclip donde reside el ImageMagick que instalé a través de MacPorts.

Para una segunda parte de esta entrada me dejo pendiente el uso de Amazon S3 como almacenamiento y la personalización del post-procesado de los ficheros adjuntos, con los denominados processors.

Sin comentarios

Envía tu comentario