我使用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。
由于
答案 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()
属性等等)并且没有任何效果。
非常感谢能够提供帮助的任何人!