jueves, 20 de noviembre de 2008

Conferencia Rails 2008 - Impresiones

Este año he salido de la conferencia con la impresión de que ha sido un poco más floja que el año pasado, aunque puede ser algo subjetivo, ya que el año pasado fue la primera a la que iba y muchos de los conceptos eran nuevos para mi

Bueno, en mi opinión las charlas dignas de mención son:


Son dignas de mención más que por su contenido, ya que al final hay cosas que ya habia oido y leido varias veces, por tener ponentes competentes, con capacidad de mantener la atención, que se saben explicar, que se han preparado el contenido, que saben contestar a las preguntas... vamos, los requisitos minimos que debería tener una presentación para ser aceptada

El resto, o no fui o no merecen la pena ser comentadas....

lunes, 13 de octubre de 2008

miércoles, 6 de agosto de 2008

Escalado proporcional de imágenes con attachment_fu

Por defecto attachment_fu (y su predecesor acts_as_attachment), no escalan las imagenes proporcionalmente al pasarles el parámetro :resize_to, sino que simplemente cambian el ancho y alto a los valores del parámetro.

En attachment_fu, para que escale es tan simple como usar un 'geometry string'. En este test se pueden ver varios ejemplos de escalado

http://github.com/technoweenie/attachment_fu/tree/master/test/geometry_test.rb

así que si queremos tener un tamaño máximo de 200 x 200 pondremos

has_attachment :resize_to => "200x200>"


En el caso de acts_as_attachment, no tenemos esa posibilidad, pero el cambio para que escale es muy simple. En el fichero

vendor/plugins/acts_as_attachment/lib/technoweenie/acts_as_attachment/instance_methods.rb

Dentro del método attachment_data cambiamos

thumbnail_for_image(img, attachment_options[:resize_to])

por

size = attachment_options[:resize_to]
if size.is_a?(Array)
size_ratio = size[0].to_f / size[1].to_f
ratio = img.columns.to_f / img.rows.to_f rescue 0
large_width = (ratio > size_ratio or ratio == 0) ? size[0] : size[1]*ratio
large_height = (ratio < size_ratio or ratio == 0) ? size[1] : size[0]/ratio
size = [large_width, large_height]
end
thumbnail_for_image(img, size)

Y ya escala proporcionalmente. Este trozo de código podría ser más elegante, tal y como esta hecho en

http://github.com/technoweenie/attachment_fu/tree/master/lib/geometry.rb

Pero bueno, ese código lo tengo hecho hace tiempo y funciona :-)

miércoles, 30 de julio de 2008

foreign key migrations

Hoy acabo de darme cuenta por n-esima vez, y no escarmiento, de que a veces es importante leer antes de ponerse a hacer las cosas.

Me he instalado el plugin Foreign Key Migrations y me daba este error en el db:migrate

rake aborted!
undefined method 'name' for #
C:/projects/f2f/community/vendor/plugins/foreign_key_migrations/lib/red_hill_consulting/foreign_key_migrations/active_record/connection_adapters/table_definition.rb:16:in 'column'
C:/projects/f2f/community/vendor/plugins/foreign_key_migrations/lib/red_hill_consulting/foreign_key_migrations/active_record/connection_adapters/table_definition.rb:11:in 'primary_key'
C:/projects/f2f/community/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb:96:in 'create_table'


Al principio he pensado que era culpa de que era cosa de que lo he instalado en Rails 2.1.0 y después de perder un buen rato depurando y buscando donde estaba definido el metodo name de TableDefinition, la solución era tan simple como leerse la página del plugin:

Dependencies

  • RedHill on Rails Core (redhillonrails_core).

Y efectivamente, despues de instalar RedHill on Rails Core ya funciona.... que penita....

viernes, 18 de julio de 2008

Exportar a excel desde ruby

Normalmente, la exportación a Excel la resuelvo simplemente creando un fichero csv con FasterCSV

csv_string = FasterCSV.generate do |csv|
# Aquí la generación del csv
end
send_data csv_string, :filename => 'nombre.xls'


Pero me he encontrado en una aplicación que el cliente pide directamente un Excel para evitar la pantalla de importar CSV. He encontrado estas alternativas:

  • Librerias Win32OLE, pero esta opción no me vale ya que el servidor es Linux
  • La gema Spreadsheet-Excel , que genera formato Excel 95
  • Generar una tabla HTML y ponerle las cabeceras de excel
  • Generar un XML para Excel 2003 tal y como cuentan en la wiki de rubyonrails
Al final la solución que he elegido es la última, practicamente ha sido un copy-paste del ejemplo añadiéndole un nuevo estilo en negrita:

xml.Style 'ss:ID' => 'Header' do
xml.Font 'ss:Bold' => '1'
end

Y aplicar ese estilo a las celdas de la cabecera

xml.Cell 'ss:StyleID'=>'Header' do


El único problema que me he encontrado es que OpenOffice no reconoce un .xls en formato XML, así que para abrirlo con Calc, hay que renombrarlo a .xml. Con Office se abre sin problemas.