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 :-)