Hazte Online

pon un poco de informática en tu vida

Paperclip: ...is not recognized by the identify command

Una forma sencilla de adjuntar ficheros en un modelo de Rails es utilizar la gema Paperclip.

Siguiendo su documentación no es muy complicada de manejar, pero yo he tenido un par de problemas como el de is not recognized by the identify command que paso a relatar.

Lo primero de todo, Paperclip utiliza ImageMagick para la manipulación de las imágenes, por lo que hay que instalarla. Para ello, en Ubuntu lo podemos hacer mediante sudo apt-get install imagemagick en un terminal. Aunque también existe para diferentes plataformas

En Gemfile añadiremos:

1
gem "paperclip", "2.7.0"

Y aquí­ viene uno de los motivos por los que puede dar el error de is not recognized by the identify command Tenemos que añadir explícitamente gem "cocaine", "0.2.1". Si no ponemos nada nos instalará ~0.5 y al parecer no es compatible.

Yo estoy utilizando la versión 2.7.0 de paperclip, es posible que utilizando la 3 no de este problema.

Otro posible motivo por el que pueda dar el error es porque no encuentre la ruta del archivo. Para ello debemos modificar config/environments/development.rb y config/environments/production.rb para especificar la misma. Hay que tener en cuenta que esta ruta puede ser distinta en production y en development.

Para hallar esta ruta hay que ejecutar which convert lo que nos devolverá¡ la ruta donde se encuentra la herramienta convert de ImageMagick. Por ejemplo si en local nos devuelve /usr/bin/convert en development.rb añadiremos:

1
Paperclip.options[:command_path] = "/usr/bin"

Una vez hecho esto nos queda añadir en el modelo que queramos añadir el archivo adjunto:

1
2
3
4
5
6
7
class Foto < ActiveRecord::Base
  attr_accessible :descripcion, :imagen_content_type, :imagen_file_name, :imagen_file_size, :imagen_updated_at, :imagen

  has_attached_file :imagen,
                    :styles => { :original => "1024x1024>", :thumb => "100x100!" },
                  :url => "/images/gallery/:id/:style_:filename"
end

Donde styles son los distintos tipos de imágenes que queremos tener. Paperclip creará¡ una imagen por cada estilo atendiendo a las características del mismo. A cada estilo le asignaremos una forma de redimensionar la imagen. En el ejemplo original no será mayor de 1024 de alto ni de ancho. En el estilo thumb se fuerza a que sea 100 de alto por 100 de ancho.

Ojo en attr_accessible donde hay que añadir :imagen_content_type, :imagen_file_name, :imagen_file_size, :imagen_updated_at, :imagen (en caso de que el campo donde guardemos el adjunto se llamara imagen)

En application.rb me gusta añadir la siguiente configuración para que me muestre los errores que pueda dar al procesar las imágenes:

1
2
3
Paperclip.options[:whiny_thumbnails] = true
Paperclip.options[:log] = true
Paperclip.options[:log_command] = true

La siguiente línea es solo para production, ya que en mi servidor me daba un error al intentar subir las imágenes:

config/environments/production.rb
1
config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache

El formulario donde incluiremos el file_field para subir el adjunto puede quedar como el siguiente, teniendo en cuenta no olvidar el :multipart => true:

formulario - app/views/fotos/_form.html.haml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
= form_for @foto, :html => { :multipart => true } do |f|
  - if @foto.errors.any?
    #error_explanation
      %h2= "#{pluralize(@foto.errors.count, "error")} prohibited this foto from being saved:"
      %ul
        - @foto.errors.full_messages.each do |msg|
          %li= msg

  .field
    = f.label :descripcion
    = f.text_field :descripcion
  .field
    = f.label :imagen
    = f.file_field :imagen
  .actions
    = f.submit 'Grabar'

Para llamar a los diferentes estilos que hayamos creado tendremos que hacerlo mediante imagen.url(:estilo) por ejemplo tenemos el siguiente código:

formulario - app/views/fotos/galeria.html.haml
1
2
3
  -@fotos.each do |f|
    %a{:href=> f.imagen.url, :rel => "gallery", :title => f.descripcion}
      %img{ :src => f.imagen.url(:thumb), :alt => "", :title => f.descripcion }

Comentarios