Bicicletes_electriques
Disseny6
Disseny6
Llancaport
Fotocarreras
Carrigan
Girodansa

Ruby on Rails y Attachment_fu. Puliendo pequeños detalles

Vamos a tratar de solucionar un pequeño problema con Attachment_fu. I es que si no validamos la presencia de un archivo a subir des del modelo, obtendremos un error a la hora de eliminar o modificar registros sin archivos asociados. Puede que no sea obligatòrio subir un pdf a nuestra aplicación, pero que queramos ofrecer la posibilidad. En ese caso no podemos validar la presencia del "attachment" des del modelo.

Pues bien, cuando tratamos de eliminar/editar un registro que no tiene asociado un archivo y estamos usando attachment_fu en el modelo no podremos hacerlo y nos aparecerá el error:

can't convert nil into String

Lo curioso es que no tendremos problema a la hora de crear el registro, pero sí cuándo queramos eliminar o editar ese registro.

Para solucionar el problema haremos unos pequeños cambios en el código del plugin:

Buscaremos el archivo "attachment_fu.rb" dentro de la carpeta del plugin y hacemos los siguientes cambios:

ELIMINAMOS:

def save_attachment?
File.file?(temp_path.to_s)
end

AÑADIMOS EN SU LUGAR:

def save_attachment?
if temp_path
return File.file?(temp_path.to_s)
else
return false
end
end

MODIFICAMOS LA ACCIÓN "temp_path" de la siguiente forma:

def temp_path
return nil if temp_paths.empty?
p = temp_paths.first
p.respond_to?(:path) ? p.path : p.to_s
end

BUSCAMOS LA ACCIÓN "temp_paths" (Justo después de la anterior)

ELIMINAMOS:

temp_paths ||= (new_record? || !File.exist?(full_filename)) ? [] : [copy_to_temp_file(full_filename)]

Y PONEMOS EN SU LUGAR:

@temp_paths ||= (new_record? || filename.blank? || !File.exist?(full_filename)) ? [] : [copy_to_temp_file(full_filename)]

Ahora buscamos el archivo "file_system_backend.rb" en la carpeta del plugin y dejamos la acción "full_filename" de la siguiente forma:

 

def full_filename(thumbnail = nil)
return nil if thumbnail_name_for(thumbnail).blank?
file_system_path = (thumbnail ? thumbnail_class : self).attachment_options[:path_prefix].to_s
File.join(RAILS_ROOT, file_system_path, *partitioned_path(thumbnail_name_for(thumbnail)))
end

Bien, eso es todo. Ya podemos eliminar y modificar registros de attachment_fu a los que no hemos asociado ningun archivo usando el plugin.

También os dejo un par de enlaces (con RMagick , mini-magick) sobre cómo modificar el plugin para que recorte los imágenes en lugar de "deformarlas" en los thumbnails.


David - 9 months ago | Ruby on Rails | 7 comentarios

Comentarios

Deja tu comentario




AVISO

Todos los campos de éste formulario son obligatorios

Este formulario no admite enlaces ni etiquetas HTML, no te molestes en intentarlo. ;-)