Acutalizar página despues de enviar un ar chivo

Tengo una acción que hace lo siguiente:

def download
@archive = Archive.find(params[:id])
previous_state = @archive.state.name

@archive.update_attributes({:state_id => State.find(:first,

:conditions => [“name = ?”, “Bloqueado”]), :user_id => current_user.id})

respond_to do |format|
  format.html { send_file("public/" + @archive.public_filename,

:type => @archive.content_type) if previous_state == “Desbloqueado” }
format.xml { render :xml => @archive }
end
end

Cambia el estado de un archivo y lo envía (si antes no estaba
bloqueado). La cuestión es que después de que envíe el archivo necesito
que refresque la página para que muestre el nuevo estado pero no se me
ocurre como hacerlo.

¿Alguna idea? Gracias.

Hola,

@archive.update_attributes({:state_id => State.find(:first, 

:conditions => [“name = ?”, “Bloqueado”]), :user_id => current_user.id})

respond_to do |format|
  format.html { send_file("public/" + @archive.public_filename, 

:type => @archive.content_type) if previous_state == “Desbloqueado” }

Cambia el estado de un archivo y lo envía (si antes no estaba
bloqueado).

ten cuidado con eso. Si no me equivoco, cambias el estado siempre, esté
bloqueado por otro usuario o no, así que si estaba ya bloqueado por otro
lo estás dejando marcado como bloqueado por el usuario actual aunque no
se lo descargue (eso lo arreglas metiendo el update_attributes dentro
del if)

La cuestión es que después de que envíe el archivo necesito que refresque la página para que muestre el nuevo estado pero no se me ocurre como hacerlo.

si no me equivoco, esto está complicado porque a una petición HTTP sólo
le puedes mandar una respuesta, así que si envías el archivo, en la
misma petición no puedes hacer más.

Lo que sí podrías hacer es jugar un poco con javascript para conseguir
ese efecto. Por ejemplo podrías hacer que al hacer la petición, si el
usuario tiene permiso se pinta la página de respuesta que querías pero
con una llamada en el onload (o al final del javascript) para que llame
a la acción que hace realmente el sendfile.

como ejemplo

Con eso haces el submit del form que va a ir a por tu documento, y como
le ponemos target=_BLANK, el contenido de la vista que acabas de pintar
no cambiaría. Siempre puedes incluir un bloque por si alguien
no tiene javascript y quieres proporcionar un link en ese caso (antes de
que se me queje nadie por la accesibilidad de la solución :wink: )

saludos,

javier ramírez

Llevabas toda la razón de que cambiaba de estado siempre. Ahora quedó
así:

def download
@archive = Archive.find(params[:id])

respond_to do |format|
  format.html {
    if @archive.state.name == "Desbloqueado"
      @archive.update_attributes({:state_id => State.find(:first,

:conditions => [“name = ?”, “Bloqueado”]), :user_id => current_user.id})
send_file(“public/” + @archive.public_filename, :type =>
@archive.content_type)
else
flash[:notice] = “You can’t download this file. It’s locked.”
redirect_to(folders_url)
end
}
format.xml { render :xml => @archive }
end
end

Con respecto a lo de refrescar la página estudiaré tu opción.

Gracias y saludos.

javier ramirez escribió:

buenas,

el copy&paste me ha jugado una mala pasada y te puse dos IDs diferentes
que no se corresponden. Por si acaso lo pongo corregido

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs