在Rails中重置Recaptcha

时间:2016-04-01 01:57:42

标签: javascript jquery ruby-on-rails ajax recaptcha

我使用Ambethia Recaptcha gem手动滚动注册表单。当表单有效时,一切正常。但是,如果不是,我需要重置ReCaptcha。这是创建方法:

def create
    @users = User.all
    @user = User.create(user_params)

    respond_to do |format|
      if verify_recaptcha(model: @user, timeout: 300, message: "Problem with ReCAPTCHA, please try again.") && @user.save
        session[:user_id] = @user.id
        flash[:notice] = "Thank you for signing up!"
        format.html 
        format.js {render js: "window.location = '#{root_path}';"}
        format.json { render :show, status: :created, location: @user }

        if Rails.env.production?
          UserMailer.welcome_email(@user).deliver
        end
      else
        flash[:alert] = "Sign Up Failed!"
        format.html { redirect_back(fallback_location: root_path) }
        format.js
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

你知道,当表格正确时,ReCaptcha会起作用,但是当验证失败时,如密码不匹配,Recaptcha就会显示已经检查过。然后,当您更正验证错误时,您无法重做ReCaptcha并且出现“ReCAPTCHA问题...”错误。这是包含我的recaptcha_tags

的表单
<div class="modal-dialog">
  <div class="spinner">
    <%= image_tag "loading.gif" %>
  </div>
  <div class="modal-content">
      <div id="registration-form">
        <h1>Sign Up</h1>
        <%= form_for @user, remote: true, html: { style: "display:inline;" } do |f| %>
        <div class="modal-body">
          <ul class="errors"></ul>
          <div class="field">
            <%= f.label :email %><br>
            <%= f.email_field :email, required: true, autofocus: true, placeholder: "Enter a valid email" %>
          </div>
          <div class="field">
            <%= f.label :username, 'Username' %><br>
            <%= f.text_field :username, required: true, placeholder: "Pick a username" %>
          </div>
          <div class="field">
            <%= f.label :password %><br>
            <%= f.password_field :password, required: true, placeholder: "Create a password" %>
            <p id="form-tip">Passwords must be at least <strong>8 characters</strong> in length and contain at least <strong>one upper case letter</strong>, <strong>one lower case letter</strong>, and <strong>one number or special character</strong>.</p>
          </div>
          <div class="field">
            <%= f.label :password_confirmation %><br>
            <%= f.password_field :password_confirmation, required: true, placeholder: "Password again" %>
          </div>

          <%= render 'recaptcha' %>

          <div class="modal-footer actions">
            <%= f.submit "Sign Up", class: "btn btn-l btn-success"%>
            <%= link_to "Cancel", "#", class: "btn btn-l btn-danger", data: {dismiss: "modal"} %>
          </div>
        <% end %>
      </div>
    </div>
  </div>
</div>

此表单使用导航栏按钮的AJAX请求呈现。表单提交会触发以下 _save.js.erb

$("ul.errors").html("")
<% if @user.errors.any? %>
    <% @user.errors.full_messages.each do |message| %>
        $("ul.errors").append($("<li />").html("<%= message.html_safe %>"))
    <% end %>
<% else %>
    $("#new_user_modal").modal("hide")
<% end %>

我尝试添加$(".g-recaptcha").grecaptcha.reset();来重新加载重新加载。我尝试了很多东西。似乎没什么用。 当我的表单重新加载验证错误时,应该会出现一个新的ReCAPTCHA框。或者以某种方式允许用户修复错误并继续而不重做recaptcha。

由于

2 个答案:

答案 0 :(得分:3)

尝试类似下面的代码,它将(通过jquery)绑定到JSON return / 422抛出的ajax:error。

$('#registration-form form').on("ajax:error", function(e, xhr, status, error) {
  if (window.grecaptcha) grecaptcha.reset();
})

最简单的方法,使用像jQuery这样的东西将绑定到你的表单元素,并在出错时处理它。当您的远程调用返回时,您只需重置表单,但仅在出错时。这样,您可以确保您的用户始终获得新的reCaptcha表单并再次验证。这似乎是RAILS宝石的一部分,因为我今晚击中同一件并使用它解决了它。

答案 1 :(得分:1)

所以没有人回应,但我现在找到解决问题的办法。我仍然无法“重置”ReCaptcha,但是通过从控制器中的import time start_time = time.clock() main() print time.clock() - start_time, "seconds" 方法中删除“可选”参数,它不再期望用户重新提交新的重新接收。主要是它将ReCaptcha与用户模型无绑定,允许它“绕过”模型验证。我在 users_controller.rb

中更新了这一行
verify_recaptcha

到此:

...
if verify_recaptcha(model: @user, timeout: 300, message: "Problem with ReCAPTCHA, please try again.") && @user.save
        session[:user_id] = @user.id
...

仍然有兴趣了解如何实际重置 ReCaptcha(最好是通过gem本身或jQuery调用)。我抛弃了所有内容(清除div,切换类,... if verify_recaptcha && @user.save session[:user_id] = @user.id ... 函数,弄乱g-recaptcha.reset()属性等等)并且没有任何效果。

非常感谢能够提供帮助的任何人!