Cómo gestionar ficheros e imágenes en Ruby on Rails

Recientemente hemos descubierto UploadColumn, un plugin muy interesante para gestionar la subida de ficheros en nuestras aplicaciones Rails de manera muy sencilla.

Veamos un ejemplo para subir imágenes, que es uno de los casos más usuales.

Lo primero que tenemos que hacer es instalar el plugin en nuestro proyecto via github:

git clone git://github.com/jnicklas/uploadcolumn.git vendor/plugins/upload_column

Si vamos a manejar imágenes, es importante que hayamos instalado previamente la gema RMagick y sus bibliotecas asociadas. Si usas Mac OS X, puedes descargarte este bonito script y ejecutarlo desde tu consola. En menos de media hora tendrás instaladas todas las bibliotecas necesarias y RMagick ejecutándose en tu ordenador. Cualquier otra pregunta sobre la instalación de RMagick la puedes resolver en su página oficial.

Pasemos a la acción. Supongamos que queremos incorporar una imagen en alguno de nuestros modelos, por ejemplo, la foto de un usuario.

Hemos creado el modelo User y necesitamos añadir una columna de tipo ristra para guardar la dirección de la imagen. Atención: en la base de datos no se guarda la imagen en si, sino una dirección que apunta al destino de dicha imagen en nuestro sistema de ficheros.

Vamos a llamar a la columna anteriormente mencionada picture, por lo que en la migración de User tendriamos algo como:

t.string :picture

Llegados a este punto tenemos que indicar en el modelo User qué columna será la que almacene la imagen:

image_column :picture

El método image_column nos permite subir solo imágenes, y tiene multiples opciones para controlar los parámetros más variados. Para subir ficheros genéricos tienes que usar el método upload_column.

Vamos a incluir la subida de la imagen en la vista de creación de un usuario (se supone creada por un scaffold). Tenemos que modificar nuestro formulario para que acepte multipart forms :

<% form_for(@user , :html => {:multipart => true } )do |f| %>

Por último añadimos el helper que permite indicar la dirección (local) de la imagen

<p> <b>Imagen</b><br /> <%= upload_column_field 'user', 'picture' %></p>

Con esto ya podemos subir nuestras imagenes, que por defecto se guardarán en el directorio proyecto/images/public/picture/id_usuario/imagen

Esperamos que este pequeño tutorial facilite vuestros desarrollos. Puedes encontrar más información sobre esta componente en la página oficial de UploadColumn

1 Comentario

Avatar del autor arreche, el 24 de Junio de 2008, a las 24 de Junio de 2008h. (GMT), dijo:

Um tiene buena pinta. Voy a probarlo en mi viejo ibook con osx…

ruby script/server
=> Booting Mongrel (use ’script/server webrick’ to force WEBrick)
=> Rails application starting on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
** Starting Mongrel listening at 0.0.0.0:3000
** Starting Rails with development environment…
Exiting
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require’: no such file to load — RMagick (MissingSourceFile)
from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/rubygems/custom_require.rb:27:in `require’
from /Library/Ruby/Gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:496:in `require’
from /Library/Ruby/Gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:342:in `new_constants_in’
from /Library/Ruby/Gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:496:in `require’
from /Users/asantanana/Desktop/chiquetete/vendor/plugins/stable/lib/upload_column.rb:3
from /Library/Ruby/Gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:203:in `load_without_new_constant_marking’
from /Library/Ruby/Gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:203:in `load_file’
from /Library/Ruby/Gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:342:in `new_constants_in’
… 48 levels…
from /Library/Ruby/Gems/1.8/gems/rails-2.0.2/lib/commands/server.rb:39
from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require’
from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/rubygems/custom_require.rb:27:in `require’
from script/server:3
server:chiquetete asantanana$ vim /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/rubygems/custom_require.rb

Toma castaña! Bien. Pensemos… Que haria un mono de feria en estos casos?

… Anda! me ha parecido ver un lindo RMagick por esas lineas… Tal vez si ahora meto la gema rmagick… Ah! pues parece que tambien tengo que invitar al sistema a un tal imagemagick http://www.imagemagick.org/script/binary-releases.php#macosx

Pues tampoco funciona…. Y dando un rodeo?… Veamos… http://rmagick.rubyforge.org/install-faq.html#osx …Coño! El colega de los Macports! Hace unos años que con algo de eso le salieron las rayas del tiguer a mi ibook! Cosas del exceso de temperatura entre compilación y fundicón… Plan B: Mejor probare con este script marca ACME http://rubyforge.org/projects/rmagick/ … Anda! Tambien necesita de compilaciones. Despues de todo las rayas pasaron de moda hace tiempo y ahora se lleva algo mas a lo Leopard….

Hooray! Despues de unas veinte mil leguas de viaje submarino, rails ya no se queja al lanzar el servidor…. Habra que esperar a otro dia para ver que tal funciona el UploadColumn este por que ya quede ajito de todo esto…

Un saludo mama!

Añade tu comentario