设计before_action:在创建用户之前验证reCaptcha

时间:2017-02-20 23:22:22

标签: ruby-on-rails ruby ruby-on-rails-4 devise ruby-on-rails-5

我尝试使用Devise设置reCaptcha,我想添加一个过滤器,在允许创建用户之前检查verify_recaptcha是否为true。如果它为假,则不应创建用户。

我试图跟随Devise的documentation了解如何做到这一点,但它似乎并不适用于我的情况。我也在生产模式下测试recaptcha,一般设置工作,我可以检查reCaptcha是真还是假。

这就是Devise告诉我在RegistrationsController中做的事情:

prepend_before_action :check_captcha, only: [:create] # Change this to be any actions you want to protect.

private
def check_captcha
  unless verify_recaptcha
    self.resource = resource_class.new sign_up_params
    respond_with_navigational(resource) { render :new }
  end 
end

没有工作。我100%确定verify_recaptcha方法有效,并且设置没有问题。

我试过了:

class RegistrationsController < Devise::RegistrationsController
    before_action :check_captcha

  private
    def check_captcha
      if !verify_recaptcha == true
        flash[:recaptcha_error] = "Fejl. Husk at sætte flueben i at du ikke er en robot"
        signupuser_users_path
      end 
    end

但没有运气。我该怎么做?设备通常在用户注册之前处理要运行的验证方法吗?

3 个答案:

答案 0 :(得分:0)

最终通过更改设计方法的一小部分来使其工作:

AlertDialog

我猜设计背后的设备对我来说有点太高级了,不能用我自己的方法进行推广,但是稍微调整就可以解决问题了

答案 1 :(得分:0)

您可以使用javascript验证

<%= submit_tag "Sign Up", :onclick => "return validatecaptcha();" %>

<script type="text/javascript" language="javascript">
    function validatecaptcha(){
        var captcha_response = grecaptcha.getResponse();
        if(captcha_response.length == 0)
        {
            // Captcha is not Passed
            $("#notice").html('<div class="alert alert-danger">'+"Captcha mandatory"+'</div>');
            return false;
        }
        else
        {
            // Captcha is Passed
            return true;
        }
    }
</script>   

答案 2 :(得分:0)

//inside your btn listener in Main7Activity.java

FragmentTow mstPeopleFragment (FragmentTow)fa.getItem(vp.getCurrentItem());

textTeam = mstPeopleFragment.getView().findViewById(R.id.tv_team);
textGroup = mstPeopleFragment.getView().findViewById(R.id.tv_group); 

textTeam.setVisibility(View.GONE);
textGroup.setVisibility(View.GONE);