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.