domingo, 18 de septiembre de 2011

Double submit -> Double post -> Duplicated data

Si tus usuarios hacen esto:
  1. Pulsar dos veces la tecla enter/intro
  2. Doble click en "guardar"
Y te has encontrado con:
  1. Registros duplicados aleatorios inexplicables.
  2. Usuarios que intentan sabotear / automatizar la aplicación mandando múltiples submits.
  3. Una lógica de modelo que no gestiona los duplicados.
Esto te puede interesar:

En algunos casos, bien por la acción del mismo usuario o por algún error derivado del envió del post, el servidor recibe dos peticiones de post idénticas, entonces se puede dar el caso que acepte las dos y se generen registros duplicados o que se guarde un registro y se devuelva un mensaje de error para el segundo, con lo que confundiremos al usuario.

Aproximaciones al problema:
  1. Implementación javascript del tipo "<form onSubmit="doublePostCheck()"> donde la función solo devuelve verdadero la primera vez.
  2. Token / Flag validation: de un variable tipo "hidden" en el cliente y validación en el servido.
  3. Hash de les variables del post y comparación de este con el último.
En el punto 1 dependemos del usuario (que no desactive el Javascript o lo salte), en los puntos 2 y 3 no queda claro como gestionar el segundo submit.

La solución ':disable_with => 'Saving...' :

Modificar la vista y añadir "<%=  f.submit 'Save', :disable_with => 'Saving...' %>".

La solución cumple con:
  • Evita el problema del "doble enter", "doble click".
  • Evita el problema del doble envio del post
  • KISS (Keep it simple stupid).
  • SPOT (Single point of thrut).

No hay comentarios:

Publicar un comentario