我在 Ruby on Rails 的表单上使用 reCAPTCHA gem (https://github.com/ambethia/recaptcha)。当用户提交有错误的表单(就像他们忘记了某个字段)时,我遇到了问题。当表单再次呈现错误时,似乎无论如何,验证码总是提交错误,即使它显示了复选标记。如果我重新加载页面,那么它就可以正常工作。有办法解决这个问题吗?
更新:我在用户注册页面上使用 recaptcha,并且基本上遵循了 gem github 页面中的代码。
表格视图:
<%= form_with(model: @user) do |f| %>
<%= render :partial => 'shared/error_messages', :locals => { :object => @user} %>
<%= f.label :firstname, "First Name" %>
<%= f.text_field :firstname, class: 'form-control' %>
<%= f.label :lastname, "Last Name" %>
<%= f.text_field :lastname, class: 'form-control' %>
<%= f.label :email, "E-mail Address" %>
<%= f.email_field :email, class: 'form-control' %>
<%= f.label :password, "Password" %>
<%= f.password_field :password, class: 'form-control' %>
<%= f.label :password_confirmation, "Confirm Password" %>
<%= f.password_field :password_confirmation, class: 'form-control' %>
<center><%= recaptcha_tags %></center>
<br>
<%= f.submit "Create New User", class: "btn btn-primary" %>
<% end %>
在控制器中:
def create
@user = User.new(user_params)
if verify_recaptcha(model: @user) && @user.save
@user.send_activation_email
flash[:info] = "Please check your email to activate your account"
redirect_to root_url
else
render 'new', status: :unprocessable_entity
end
end
我可以在第一次提交表单时的参数中看到 g-recaptcha-response 存在。但随后每次发生表单验证错误后,g-recaptcha-response 都是空的,并且我收到“reCAPTCHA 验证失败,请重试”。这也会忽略其他表单验证错误,并且仅在我再次提交表单错误的表单时显示验证码错误。
我已经尝试过使用企业版和经典版,并确保密钥是正确的。我使用的是 V2 版本,需要勾选“我不是机器人”
此问题可能与 Turbo 有关,它尝试通过仅替换网页的几个部分来替换整页重新加载。虽然这通常工作得很好,但在这种情况下显然不行。
尝试通过替换来禁用登录表单的 Turbo
<%= form_with(model: @user) do |f| %>
与
<%= form_with(model: @user, local: true, data: {turbo: "false"} ) do |f| %>
要详细了解 Turbo,请访问 this