Чтение параметров из метода create

У меня есть проект 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 или пустая строка

Это все коды RegistrationsController? Ошибка говорит о том, что вы используете метод или переменную recaptcha где-то внутри вашего RegistrationsController, который нигде не был определен.

Sajad Rastegar 24.03.2019 16:22

Вы пробовали использовать params[:"g-recaptacha-..."] ? Я не уверен, что символы Ruby могут содержать дефисы.

JuanM. 24.03.2019 18:32

А вместо not present? можно использовать empty?

JuanM. 24.03.2019 18:33
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
74
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Используйте 'g-recaptcha-response' вместо :g-recaptcha-response. Вам нужно использовать строковый синтаксис, потому что вы не можете использовать - в именовании символов.

:"g-recaptcha-response" — это символ с тире. Это конечно возможно, только не так :g-recaptcha-response
Frederik Spang 24.03.2019 19:06

и это хороший код? Я так не думаю. В нашей компании мы используем строку вместо символов в этой ситуации. Конечно, это зависит от стиля кода в компании.

IlyaOsotov 24.03.2019 19:49

Идея Фредерика действительно помогла мне получить струну. Спасибо.

Klarkel Goldvein 24.03.2019 21:14

Хорошо, это то, что я понял, что сработало. Спасибо всем, кто помог

    @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

Другие вопросы по теме