No solo necesitaba agregar imágenes, sino generar thumbnails de al menos 2 tamaños distintos.
Por suerte me topé con Paperclip que facilita infinitamente trabajar con archivos dentro de Rails. A continuación les presento un tutorial básico de su instalación y configuración:
Paperclip es un plugin de Rails, se pueden descargar la última versión de acá y extraerla en la carpeta /vendor/plugins de su proyecto. Ahora supongamos que queremos agregar una foto a nuestro modelo Usuario, para ello utilizamos has_attached_file de la siguiente forma:
class Usuario < ActiveRecord::BaseComo podemos ver, en el array :styles le pasamos las medidas de nuestros thumbnails, por lo que cuando subamos una foto, Paperclip generará 3 versiones: la original, una mediana de 300x300 y un thumnail de 100x100. Ambas operaciones de re-dimensionamiento mantendrán las proporciones de la imágen. Si se quiere cortar la imagen a redimiensionar hay que especificar el tamaño de esta forma: "100x100#".
has_attached_file :foto, :styles => {
:mediana => "300x300>",
:thumb => "100x100>" }
end
Ahora necesitamos crear una migración para agregar los campos necesarios a nuestra tabla usuarios.
class AgregarFotoDeUsuario < ActiveRecord::MigrationCorremos las migraciones:
def self.up
add_column :usuarios, :foto_file_name, :string
add_column :usuarios, :foto_content_type, :string
add_column :usuarios, :foto_file_size, :integer
add_column :usuarios, :foto_updated_at, :datetime
end
def self.down
remove_column :usuarios, :foto_file_name
remove_column :usuarios, :foto_content_type
remove_column :usuarios, :foto_file_size
remove_column :usuarios, :foto_updated_at
end
end
rake db:migrateEl siguiente paso es modificar nuestro form de Usuario para subir una imágen.
<% form_for :usuario, @usuario, :url => usuario_path,No olvidarse de "multipart => true" ya que es lo que permite al form subir la imágen en el post.
:html => { :multipart => true } do |form| %>
<%= form.file_field :foto %>
<% end %>
Por suerte no tenemos que tocar nuestro controlador.
Para mostrar la foto en las vistas:
<%= image_tag @usuario.foto.url %> #muestra la original
<%= image_tag @usuario.foto.url(:mediana) %> #muestra la mediana
<%= image_tag @usuario.foto.url(:thumb) %> #muestra el thumb