从创建方法中读取参数

时间:2019-03-24 14:56:52

标签: ruby-on-rails ruby recaptcha spam-prevention

我有一个ruby on rails项目,该项目使用devise gem进行身份验证。我正在尝试使用注册页面中的验证码表单来防止漫游器创建数千个虚拟登录名

我对使用可与devise一起使用的recaptcha宝石不感兴趣,因为我没有幸运地正确设置它。

我尝试使用它作为参考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注册中创建的控制器。

devise_for :users, path: '', path_names: { sign_in: 'login', sign_out: 'logout' }, :controllers => {:registrations => "registrations"}

无论我单击验证码表单如何,我都可以创建用户。当我单击它时,在具有长文本字符串(例如

)的create方法中,我得到了参数g-recaptcha-response。
"g-recaptcha-response"=>"1234567890abcdefghi..."

我尝试了一个create方法,该方法将查看该参数并查看其是否为nil。零时,我想将一页返回到注册页面。

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的值,并在响应为零或空字符串的情况下以某种方式取消用户的创建

2 个答案:

答案 0 :(得分:1)

好的,这就是我发现的有效方法。感谢所有提供帮助的人

    @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

答案 1 :(得分:0)

使用'g-recaptcha-response'代替:g-recaptcha-response。您需要使用字符串语法,因为在符号命名中不能使用-