Al refrescar se repite la acción

Hola a todos. Seguro que a alguno os ha pasado esto:

Tengo una lista de elementos que quiero añadir a un objeto. Selecciono y
ejecuto el controlador que añade los elementos. Una vez ejecutado vuelve
a
la lista de elementos ya añadidos al objeto con un redirect_to. Si desde
esa
vista pulso F5 se añade de nuevo ese elemento con lo que ahora aparece
repetido en la lista

lista de elementos del objeto Obj

A B C

añadir elemento

E D F

selecciono D
lista de elementos

A B C D

pulso F5. Lista de elementos

A B C D D !!!

se duplica el elemento a pesar de que con el redirect_to en el navegador
se
muestra otra url
¿hay alguna forma de evitar esto?

Y otra pregunta que tengo muy simple

si tengo las tablas relacionadas A y B y hago

obj_a.lista_bs.find(:all, :conditions…)

se supone que find busca solo entre la lista de elementos de b ¿cierto?

un saludo y gracias.

Hola Rafa,

(Doy por hecho que en al pulsar F5 el navegador no te pide
confirmación para enviar de nuevo los datos: en ese caso la repetición de la
acción sería normal y para evitarla habría que ver el caso en detalle).

Las acciones que añaden/modifican/eliminan datos nunca deberían
activarse mediante peticiones tipo GET (el tipo de petición que harías
al pulsar un enlace normal y corriente): de hacerlo tanto los refrescos
con F5 como las visitas de los robots de los buscadores alterarán tus
datos.

Si sigues el convenio REST no tendrás este problema, en caso contrario
puedes comprobar si la petición recibida es GET o no usando request.get?

No sé si esto te resuelve la duda, si acaso pega el código conflictivo
en algún sitio para que podamos ayudarte más fácilmente.

obj_a.lista_bs.find(:all, :conditions…)

se supone que find busca solo entre la lista de elementos de b ¿cierto?

No sé a qué te refieres con “la lista de elementos de b”, así que cambio
el ejemplo:

rafa.friends.find(:all, :conditions…)

busca solamente entre los amigos de rafa aquellos que cumplen las
condiciones indicadas.

On 10/28/07, Rafa C. [email protected] wrote:

Tengo una lista de elementos que quiero añadir a un objeto. Selecciono y
ejecuto el controlador que añade los elementos. Una vez ejecutado vuelve a
la lista de elementos ya añadidos al objeto con un redirect_to. Si desde esa
vista pulso F5 se añade de nuevo ese elemento con lo que ahora aparece
repetido en la lista

Intenta:

redirect_to(foo_url, :status => :303)

La página del listado sí pide confirmación tras pulsar F5. Lo que me
extraña
es eso, que la url de la página no es la misma que ejecutó la acción de
añadir.

De todas formas lo que hago ahora es detectar que el elemento no está ya
agregado, pero aun así no debería dispararse la acción.

Voy a tratar de resumirte el proceso que sigo:

del listado de objetos obj2 del objeto obj1 con id 1

/myapp/obj1/obj2list/1

voy a

/myapp/obj1/obj2toadd/1

que muestra lalista de objetos obj2 para agregar al obj1. Selecciono y
agrego por post.

def addobj2
obj2ids=params[:obj2]
obj1id=params[‘id’]
if obj1id.nil?
#error
else
@obj1=Obj1.find(obj1id)
end

#comprobar que los ids son nuestros
obj2list=....find(:all, :conditions=>['id IN (?)', 

obj2ids.collect{…}])
#me quedo solo con los mios
obj2ids=obj2list.collect {|e| e.id }

#en realidad no haría falta transaction
Obj2.transaction do
  obj2ids.each do |id|
    obj2=...find(:first, :conditions=>['obj2_id=?', id])
    if obj2.nil?
      obj2=Obj2.new
      ...
      obj2.save!
    end
  end
end

redirect_to :action=>'obj2list', :id=>@obj1.id.to_s

end

he probado el 303 y no ha funcionado

Hola Damian, ya he podido probar tu propuesta del 303. Parece que
funciona
:). He probado a no comprobar si el id a añadir ya existe y aun así el
listado no cambia.

Muchas gracias.

pd: ¿qué significa exactamente el 303?

HTH

On 10/28/07, Rafa C. [email protected] wrote:

redirect_to :action=>'obj2list', :id=>@obj1.id.to_s

end

he probado el 303 y no ha funcionado

Ojo:

redirect_to({:action => ‘obj2list’, :id => @obj}, :status => 303)

Tampoco anda?

ups!
gracias…