首页 > 解决方案 > 在获取数据之前提交表单的隐形recaptcha

问题描述

我正在使用recaptcha gem。导轨 5.2。

我有以下表格:

= simple_form_for @quote_request_form, url: quote_requests_path, html: {id: "invisible-recaptcha-form"} do |f|
  .form-group
    = f.input :name, label: false, placeholder: 'First and Last Name', 
  .form-group.actions.mt-5
    button.btn.btn-primary.btn-lg.btn-block#submit-btn Submit
  = invisible_recaptcha_tags ui: :invisible, callback: 'submitInvisibleRecaptchaForm'

我为表单添加了以下 javascript:

javascript:


  document.getElementById('submit-btn').addEventListener('click', function (e) {
      e.preventDefault();
      grecaptcha.execute();
  });

  var submitInvisibleRecaptchaForm = function () {
    document.getElementById("invisible-recaptcha-form").submit();
  };

我在控制器中检查 recaptcha 的值,如下所示:

  if verify_recaptcha(model: @quote_request_form) && @quote_request_form.save
    redirect_to quote_confirm_path, notice: "Your quotation request is being processed"
  else
    render :new
  end

只要我使用 e.preventDefault(); 这一切都有效 线。如果我删除此行,我会在 recaptcha 上遇到故障,并且我可以在参数中看到 recaptcha 属性正在以空白数据发送。

我不明白为什么我需要它,因为没有文档指定它。所以我做错了什么,但我无法弄清楚。

谁能看到我如何解决这个问题?

标签: ruby-on-railsrubyinvisible-recaptcha

解决方案


您需要该e.preventDefault()语句,否则表单将在 recaptcha 执行回调之前提交。

发生这种情况是因为<button>没有类型属性具有submit默认值/行为。如果您查看recaptcha 文档,该<button>标签的type属性定义为button,它没有关联的行为,因此当您单击它时不会发生任何操作。

回到你的情况,要么保留e.preventDefault()语句,要么将type属性设置为button

.form-group.actions.mt-5
   button.btn.btn-primary.btn-lg.btn-block#submit-btn type="button" Submit
 = invisible_recaptcha_tags ui: :invisible, callback: 'submitInvisibleRecaptchaForm'

推荐阅读