Ich habe eine Hand Roll-Registrierungsformular, wo ich die Ambethia Recaptcha gem verwenden. Alles funktioniert gut, wenn das Formular gültig ist. Wenn dies nicht der Fall ist, muss ReCaptcha zurückgesetzt werden. Hier ist die create-Methode:Zurücksetzen von Recaptcha in Rails Form
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
Sie sehen, wenn das Formular korrekt ist, die ReCaptcha funktioniert, aber wenn es einen Überprüfungsfehler ist, wie Passwörter nicht übereinstimmt, die Recaptcha zeigt sich bereits geprüft. Dann, wenn Sie die Validierungsfehler korrigieren, können Sie die ReCaptcha nicht wiederholen und Sie erhalten den Fehler "Problem mit ReCAPTCHA ...". Dies ist die Form, die enthält meine 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>
Diese Form mit einer AJAX-Anforderung von einer navbar-Taste wiedergegeben wird. Formulareinreichung löst folgende _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 %>
Ich habe versucht, $(".g-recaptcha").grecaptcha.reset();
hinzufügen, um die recaptcha reload zu machen. Ich habe viele Dinge ausprobiert. Nichts scheint zu funktionieren. Wenn mein Formular mit den Überprüfungsfehlern erneut geladen wird, sollte eine neue ReCAPTCHA-Box angezeigt werden. Entweder das oder irgendwie erlauben Sie dem Benutzer, ihre Fehler zu beheben und fortzufahren, ohne das recaptcha erneut zu machen.
Dank