In rails-Controller, wie Sie verhindern, dass doppelt Einreichen (wenn der Benutzer die double-clic-senden-Schaltfläche oder drücken Sie die EINGABETASTE zweimal)?
Gut, alles ist im Titel, aber ich werde erklären, ein wenig mehr 🙂
Meiner rails-app enthalten viele Formulare (Ajaxified oder nicht).
Verhindern, dass Benutzer zu senden, die zweimal oder mehr in einigen Formularen die ich benutze Javascript.
Es ist mein Szenario für eine Ajaxified form :
- der Benutzer das Formular abschicken (Mausklick oder enter)
- die javascript deaktivieren, den submit-button
- der rails-controller-Dinge tun (wie eine Soap-Anfrage oder einen insert in eine DB)
- die rails-controller aktualisieren Sie die Seite, und aktivieren Sie die Schaltfläche senden, wenn nötig (im Fehlerfall)
Nun möchte ich hinzufügen, server-side-code hält, um die Dinge wirklich sauber, wenn der Benutzer den bypass-javascript.
Irgendwelche Vorschläge?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Sie, Redis-Verriegelung, und umschließen Sie den block mit so etwas wie
Dies ist das gem bin ich mit
https://github.com/mlanett/redis-lock
Ich benutze 4 Methode für die 4 Szenarien, bitte zunächst lieber mein awnser hier: Verhindern Doppel-legt in einer Rails AJAX form
nur auf-Einschränkung für Benutzer:
verwenden stopImmediatePropagation und hinzufügen eine click-Ereignis, um das Ziel dom.
Begrenzung der Einreichen wie ajax:
ajax verwenden, ist beforeSend attribut.
nur für die form:
oder:
deaktivieren:仅仅对表单元素,按钮等起作用,会阻止其上的事件触发
andere:
Dies ist die gem:https://github.com/mlanett/redis-lock
Können Sie die option :disable_with => "Bitte Warten..." auf den submit-tag.
Hier ist, was ich tun würde:
Dies wird nicht verhindern, dass doppelte Unterwerfung, aber zumindest wird verhindert, dass die änderungen von der zweiten zu Begehen. I. e. wenn der Benutzer das Formular absendet zweiten mal der code prüft die eingereichten token gegen die man in der Datenbank und wenn Sie nicht übereinstimmen - tun Sie das nicht, ein update auf das Objekt.
Dies hat auch das zeichnen wieder für neu erstellte Objekte (d.h., wenn der Benutzer will, um einen Kommentar zu erstellen oder etwas wie das). Aber in diesem Fall möchten Sie vielleicht zu prüfen, die Schaffung Zeitintervall vom gleichen Benutzer-und wenn es weniger als sagen wir 5 Sekunden, und Sie würde verhindern, dass das Objekt "erstellt".
Kein echter Vorschlag (ich werde nicht überrascht sein downvotes), aber es wird Ihre Website noch benutzbar sein, ohne JS? Wie wäre es ihm zeigen entsprechende Meldung, dass für den normalen Betrieb, die er braucht, zu aktivieren, JS, sonst werden Sie nicht zeigen, dass ihn viele, viele Formulare auf der Seite.
1) Es ist schön, zeigen auch einige Statusanzeige zu lassen Benutzer wissen, dass etwas passiert, dass Ihre Anfrage bearbeitet wird. Es sollte beseitigt viele doppelte unterwirft.
2) Wenn Benutzer javascript deaktiviert, wie Sie sind gonna senden "ajaxified" Formen? Wenn die Website wird nicht funktionsfähig ohne javascript, dann ist es wahrscheinlich am besten, einfach Benutzer informieren, dass die (wie Eimantas schlägt).
Bearbeiten
Ein Beispiel für einen solchen Indikator, nur klar zu sein, was ich meine, in 1.
http://www.netzgesta.de/busy/
Nicht sicher, ob das hilfreich ist:
AUF SERVERSIDE:
Frische Ladung form,
legen Sie eine session['variable']=false //d.h. die form ist nicht eingereicht-noch nicht.
Auf Formular Absenden, überprüfen Sie:
Ich zufällig das gleiche problem und habe es gelöst mit einer sehr einfachen Art und Weise(vielleicht ist es nicht die richtige oder es existiert etwas buggy konnte ich nicht feststellen, informieren Sie mich bitte, wenn du herausgefunden hast)
Hier ist meine Antwort:
Die wichtigste Frage, die ich konfrontiert war, war, dass wenn ich Doppelklick auf mein original-Taste, es würde abschicken zweimal und verursacht etwas unberechenbar, so habe ich versucht zu blockieren, die Schaltfläche mit "disabled" - Attribut rechts, nachdem Sie es anklicken. Hier ist, was ich schrieb.
Das größte problem, das ich konfrontiert war, ist, dass wenn ich Sie einfach deaktivieren Sie die senden-Schaltfläche nach rechts klicken auf die submit-Anfrage wird nicht reichen und die Seite wird gerade da hängen, wie immer nix passiert.
Ich denke, die Ursache ist, dass das "disabled" - Attribut verhindert, dass die Anfrage Absenden, Einreichen.(Ich habe zwar keine Ahnung, was die Beziehung zwischen diesen beiden (...)
So, ich denke, das deaktivieren-Ereignis ausgeführt werden soll nach submit-Ereignis.
Soweit ich das verstanden habe, Formular Absenden wird ein Javascript-event-und setTimeout ist eine asynchrone Methode. Als Javascript ausführt, basierend auf Ereignis-Schleife die ajax-Ereignis am Ende der Veranstaltung quene, und werden nur dann ausgeführt, nachdem alle der sync-events fertig stellen.
In meinem code, nach dem ersten Klick auf die Absenden-Schaltfläche wird deaktiviert, nach 0 Millisekunden, die für Menschen unmöglich ist, um auf das zweite mal, problem gelöst!