sábado, 28 de marzo de 2009

Adjuntando archivos en rails

En el proyecto que estoy trabajando ahora, una aplicación para la administración de bienes raíces utilizando rails, me he topado con tener que agregar fotos a mi modelo "propiedad".
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::Base
has_attached_file :foto, :styles => {
:mediana => "300x300>",
:thumb => "100x100>" }
end
Como 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#".

Ahora necesitamos crear una migración para agregar los campos necesarios a nuestra tabla usuarios.
class AgregarFotoDeUsuario < ActiveRecord::Migration
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
Corremos las migraciones:
rake db:migrate
El siguiente paso es modificar nuestro form de Usuario para subir una imágen.
<% form_for :usuario, @usuario, :url => usuario_path,
:html => { :multipart => true } do |form| %>
<%= form.file_field :foto %>
<% end %>
No olvidarse de "multipart => true" ya que es lo que permite al form subir la imágen en el post.
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

sábado, 28 de febrero de 2009

Timestamps en Grails

Para clases del dominio, necesitamos a veces utilizar fechas de creación y modificación. En Rails ya vienen los timestamps por defecto en las migraciones. Grails, para no quedarse atrás lo hace bastante sencillo.
Para cualquier clase del dominio que quieras agregarle los timestamps de creación y modificación debes usar los siguientes atributos:

class Usuario{
String nombre
String documento
//demas atributos...
Date dateCreated //fecha de creación
Date lastUpdated //ultima actualización
}

Recuerda que para que no te cree el campo al generar las vistas, debes poner esto en las constraints:


static constraints ={
lastUpdated(display:false)
dateCreated(display:false)
}


Espero que sirva!