У меня была проблема с людьми, дважды щелкающими мою кнопку отправки формы, и она отправлялась несколько раз, поэтому я хотел разрешить только одну отправку. Моей первой мыслью было javascript, но это не совсем мгновенно, и я хотел, чтобы что-то гарантировано работало на 100%.
Мое решение состояло в том, чтобы сделать представления идемпотентными, дав каждой форме загрузку своей собственной га sh, и при каждом представлении проверяю, существует ли этот ha sh, и, если это так, ничего не делает.
Итак, в этом суть моего кода:
#form
@hash = SecureRandom.urlsafe_base64(20)
f.hidden_field :hash, value: @hash
f.submit "submit"
#controller
existing = Submission.find_by(hash: params[:hash])
if existing.nil?
#enter new Submission into the database with hash: params[:hash]
Это работает, если Я разрешаю некоторое время между отправками, но когда я делаю двойной щелчок по кнопке отправки, в мою базу данных заносятся две записи с одинаковым значением ha sh.
Я использую простую Puma 3.7 сервер на локальном хосте. У меня сложилось впечатление, что большинство серверов получат запрос, выполнят его, а затем перейдут к следующему запросу, но похоже, что происходит какой-то тип параллелизма.
Мой вопрос: как это возможно? ? Каждая последующая запись имеет значение идентификатора на единицу больше, чем предыдущая запись, поэтому сервер не знает о предыдущей записи. Так почему же, если запросы отправляются очень быстро, уникальное требование ha sh игнорируется? Опять же, если я попробую позже с тем же ha sh, ничего не произойдет, как ожидалось.