У меня есть проект ruby on rails, который использует драгоценный камень для аутентификации. Я пытаюсь использовать форму с капчей на странице регистрации, чтобы боты не создавали тысячи фиктивных логинов.
Я не заинтересован в использовании recaptcha gem, который работает с devise, поскольку мне не удалось правильно его настроить.
Я пытаюсь настроить его, используя это как ссылку https://recaptchainrubyonrails.blogspot.com/
Вот моя страница регистрации
<h2>Sign up</h2>
<%= form_for(resource, as: resource_name, url:
registration_path(resource_name)) do |f| %>
<%= devise_error_messages! %>
<div class = "field">
<%= f.label :email %><br />
<%= f.email_field :email, autofocus: true, autocomplete: "email" %>
</div>
<div class = "field">
<%= f.label :password %>
<% if @minimum_password_length %>
<em>(<%= @minimum_password_length %> characters minimum)</em>
<% end %><br />
<%= f.password_field :password, autocomplete: "off" %>
</div>
<div class = "field">
<%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation, autocomplete: "off" %>
</div>
<div class = "g-recaptcha" data
sitekey = "6LeeL5gUAAAAADbq0vt4d9biAs8oegkPx9ttUkKb"></div>
<div class = "actions">
<%= f.submit "Sign up" %>
</div>
<% end %>
<br>
У меня есть файл маршрутов, указывающий на отдельный контроллер регистрации, а не на тот, который создан в рамках регистрации устройств.
devise_for :users, path: '', path_names: { sign_in: 'login', sign_out: 'logout' }, :controllers => {:registrations => "registrations"}
Я могу создать пользователя независимо от того, нажму ли я на форму с капчей. Когда я нажимаю на нее, я получаю параметр g-recaptcha-response в методе создания, который имеет длинную текстовую строку, например
"g-recaptcha-response"=>"1234567890abcdefghi..."
Я попробовал создать метод, который просматривал бы этот параметр и видел, не равен ли он нулю. Когда это ноль, я хотел бы вернуться на одну страницу к странице регистрации.
class RegistrationsController < Devise::RegistrationsController
def create
if not params[:g-recaptcha-response].present?
redirect_to :back
end
end
end
Я даже не могу добраться до параметра, так как он говорит об ошибке
undefined local variable or method `recaptcha' for #<RegistrationsController:0x7219e5a0> Did you mean? catch"
Я пытаюсь захватить этот параметр, посмотреть значение g-recaptcha-response и как-то отменить создание пользователя, если ответ был nil или пустая строка
Вы пробовали использовать params[:"g-recaptacha-..."] ? Я не уверен, что символы Ruby могут содержать дефисы.
А вместо not present? можно использовать empty?





Используйте 'g-recaptcha-response' вместо :g-recaptcha-response. Вам нужно использовать строковый синтаксис, потому что вы не можете использовать - в именовании символов.
:"g-recaptcha-response" — это символ с тире. Это конечно возможно, только не так :g-recaptcha-responseи это хороший код? Я так не думаю. В нашей компании мы используем строку вместо символов в этой ситуации. Конечно, это зависит от стиля кода в компании.
Идея Фредерика действительно помогла мне получить струну. Спасибо.
Хорошо, это то, что я понял, что сработало. Спасибо всем, кто помог
@response = params[:"g-recaptcha-response"]
if @response == nil
flash[:notice] = "Please click on captcha form!"
redirect_back(fallback_location: new_user_registration_path)
else
flash[:notice] = "You signed up successfully!"
redirect_to root_path
end
Это все коды
RegistrationsController? Ошибка говорит о том, что вы используете метод или переменнуюrecaptchaгде-то внутри вашегоRegistrationsController, который нигде не был определен.