Comprobar archivo subido

Estoy usando el plugin attachment_fu para subir archivos. La cuestión es
que la tabla de los archivos tiene una columna llamada “version” que
quiero incrementar cada vez que el archivo es actualizado.

Dado que el archivo puede omitirse en caso de que se modifiquen otros
datos del mismo que no sea el archivo, no se actualizaría la columna.

Cuando subo un archivo recibo esto (entre otros datos):
“uploaded_data”=>#<File:/tmp/CGI10100-2>

Cuando el archivo no va en el formulario esto:
“uploaded_data”=>""

He intentado comprobarlo con lo siguiente:
Archive.increment_counter(:version, @archive) if
!params[:uploaded_data].blank? # Tambien con any? y nil?

Y algún que otro intento más. Pero ha sido en vano, no consigo que me
funcione la condición (por que sin el if siempre incrementa).

¿Me podéis echar un cable? Gracias de antemano.

¿Me podéis echar un cable?

Claro.

Una solución podría ser

Archive.increment_counter(:version, @archive) unless params[:
uploaded_data].empty?

O también en función del
tamaño
params[: uploaded_data].each do |attachment|
Archive.increment_counter(:version, @archive) if attachment.size > 0
end

para ambos casos el formulario tiene que ser algo asi

form

<%= file_field_tag “uploaded_data[]”, :class => ‘formField’, :size =>
40 %>

Un saludo.

Ambas soluciones me dan el mismo error, el campo del formulario que uso
es el siguiente:
<%= f.file_field :uploaded_data %>

El error que obtengo es el mismo que en los ateriores casos

You have a nil object when you didn’t expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.size

No se me ocurre que puede ser, pero seguiré investigando.

alarkspur escribió:

Es que de esa manera no me funciona el attachment_fu

alarkspur escribió:

On Fri, Mar 21, 2008 at 2:27 PM, Valentín Palacios
[email protected] wrote:

<%= file_field_tag “uploaded_data[]”, :class => ‘formField’, :size =>

Un saludo.

No entiendo para que necesitas crear un array donde no es necesario.

Quizá no he seguido bien el hilo, pero ¿lo siguiente no te funciona?

Archive.increment_counter(:version, @archive) unless
params[:uploaded_data].size == 0

Suerte.

No me funciona, me da el mismo error que con los otros métodos.

You have a nil object when you didn’t expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.size

Viendo el código del plugin attachment_fu me encuentro con esto

    # Callback after an attachment has been saved either to the file

system or the DB.
# Only called if the file has been changed, not necessarily if
the record is updated.
#
# class Foo < ActiveRecord::Base
# acts_as_attachment
# after_attachment_saved do |record|
# …
# end
# end
def after_attachment_saved(&block)
write_inheritable_array(:after_attachment_saved, [block])
end

En principio solo debería de ejecutarse cuando se sube un archivo, pero
a mi me lo ejecuta siempre. Esto es lo que tengo en el modelo:

after_attachment_saved do |record|
    logger.info("Valor de record: #{record.filename}")
    Archive.increment_counter(:version, record)
 end

Voy a seguir buscando y probando. Pero si alguien me puede mostrar algo
de luz se lo agradecería jeje.

Daniel R. Troitiño escribió:

You have a nil object when you didn’t expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.size

Usa
<%= file_field_tag “uploaded_data[]”, :class => ‘formField’, :size =>
40 %>

en lugar de

<%= f.file_field :uploaded_data %>

para así pasarle un array al controlador y poder luego hacer algo

params[: uploaded_data].each do |attachment|
Archive.increment_counter(:version, @archive) if attachment.size

0
end

Espero te sirva.
Un saludo.

Pero es que de esa manera nunca me actualiza la versión. Estoy
investigando y a la hora de hacer el update, el parámetro uploaded_data
no está. Ya lo que me hace pensar esto es que tiene que ser cosa del
plugin.

Tengo la version 2.0.2 y el plugin, a menos que haya cambiado en estos
últimos dos días…

De todas formas muchísimas gracias por tu interés y ayuda. Yo sigo
intentando a ver que es lo que sucede.

Daniel R. Troitiño escribió:

2008/3/21 Valentín Palacios [email protected]:

    # Callback after an attachment has been saved either to the file
    def after_attachment_saved(&block)

<%= file_field_tag “uploaded_data[]”, :class => ‘formField’, :size =>

Un saludo.
Suerte.
http://lists.simplelogica.net/mailman/listinfo/ror-es

Pues parece que attachment_fu tiene algún problemilla con el callback
after_attachment_save, pero viendo el código no llego a comprender
porqué.
Pero como la solución anterior no te funciona y el nil parece estar ahí…

Archive.increment_counter(:version, @archive) unless
params[:uploaded_data].nil? || params[:uploaded_data].size == 0

Eso debería funcionar.

Por cierto… supongo que tienes la última versión de attachment_fu y
la última versión estable de Rails… vamos todas las cosas “a la
última” ¿no?

Suerte.

Daniel toda la razón, vaya tontería mas inmensa. Ha quedado así:

Archive.increment_counter(:version, @archive) unless
params[:archive][:uploaded_data].blank?

Y funciona perfectamente, vaya tontería y que de tiempo me he llevado.

Gracias.

Daniel R. Troitiño escribió:

2008/3/21 Valentín Palacios [email protected]:

Daniel R. Troitiño escribió:

    #       ...
    logger.info("Valor de record: #{record.filename}")

On Fri, Mar 21, 2008 at 2:27 PM, Valentín Palacios

You might have expected an instance of Array.

end
Quizá no he seguido bien el hilo, pero ¿lo siguiente no te funciona?
Ror-es mailing list
Pues parece que attachment_fu tiene algún problemilla con el callback
la última versión estable de Rails… vamos todas las cosas "a la
[email protected]
http://lists.simplelogica.net/mailman/listinfo/ror-es

Otra cosa… cuando pusiste

<%= f.file_field :uploaded_data %>

¿Esa línea está dentro de un “form_for”? En ese caso el params que
debes mirar debería ser algo como…

params[:tu_modelo][:uploaded_data]

Quizá nuestros intententos estában mal dirigidos desde el principio…

Suerte.