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?
(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.
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
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
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.