Mam taki problem przy zapisywaniu formularza jak kliknę kilka razy sumbit do bazy zapisuje się takich samych rekordów co jest zrozumiałem, macie jakiś skuteczny sposób aby bronić się przed takimi sytuacjami i nie dopuszczać do kilku zapisów tego samego obiektu.
schowaj przycisk na stronie po kliknięciu
Nie wiem czy do końca rozumiem problem ale możesz popróbować z disable_with .
submit_tag “Complete sale”, :disable_with => “Please wait…”
=>
submit_tag “Edit”, :disable_with => “Editing…”, :class => “edit_button”
=>
A walidujesz unikalność którejś z kolumn?
Tak jest walidacja, jedyną unikalną kolumną jest id. Nie widzę rozwiązania po stronie walidacji. @sarin - to rozwiązanie się sprawdza i działa dzięki.
Przecież można sobie z jakiegoś curla wysłać wtedy te zapytanie i znowu masz powielone rekordy…
Sam jestem bardziej zielony niż autor wątku, więc jeśli piszę głupoty, to proszę poprawić, przynajmniej dowiem się czegoś nowego.
Czy w powyższym przypadku nie pomogłoby zejście do poziomu bazy danych poprzez coś jak taka migracja?:
def change
add_index :some_table, :some_column, unique: true
end
Pomogłoby, problem polega na tym, że Autor wątku dopuszcza nieunikalne wartości we wszystkich kolumnach (poza primary key, oczywiście).
To może jeżeli to jest coś typu user - item, w userze dać last_submit i jakąś walidację, w stylu, że item.created_at - current_user.last_submit musi być > niż np. 5sek.
Zły trop - istnieje duże prawdopodobieństwo, że przy requestach następujących bezpośrednio po sobie walidacja w Ruby zwróci true dla obydwu (bo żaden z tych obiektów nie będzie jeszcze zapisany w bazie, kiedy będą walidowane) - i zostaną one zapisane.
Dlatego stosuje się zabezpieczenie formularza Captchą.
Widzę że dyskusja się rozwinęła, nie zgłębiałem tematu ale aby wysłać (w moim przypadku formularz należy być zalogowanym i nie wiem czy to przejdzie przez curl.
Captcha odpada … Formularz wygląda tak : pierwszy krok wybieramy parametry zlecenia, drugi potwierdzenie zlecenia i w ostatnim kroku następuje zapis wszystko się odbywa na session params w trzech akcjach new, confirm, create. Multistep w jednej akcji create jakoś mi się nie podoba.
Ostatnio męczyłem się z podwójnym kliknięciem, i jeśli link ma zapisane remote=true to disable_with nadaje się do tego w zupełności.
Sama walidacja do podwójnego kliknięcia nie do końca zda egzamin bo o ile railsy walidacja nie pozwala na ponowne zapisanie rekordu jeśli nie jest unikalny o tyle na poziomie bazy danych takiej unikalności nie mamy i wyskakuje błąd unikalności indeksów (jęsli dwa requesty zrobiło się prawie w tej samej chwili, czyli double click jak nic)
Dlatego stosuje się zabezpieczenie formularza Captchą.[/quote]
Doskonały przykład wybrania wyjątkowo złego rozwiązania danego problemu.