使用recaptcha gem for rails app时未初始化的常量Recaptcha(NameError)

时间:2017-06-14 09:46:40

标签: ruby-on-rails recaptcha

我正在使用Rails 5.0.3应用程序(使用Ruby 2.4.1)并尝试在我的网站上的联系我们表单中安装Recaptcha v2功能。

我收到以下错误: -

/config/initializers/recaptcha.rb:1:in `<top (required)>': uninitialized constant Recaptcha (NameError)
    from /home/[$user]/.rvm/gems/ruby-2.4.1/gems/railties-5.0.3/lib/rails/engine.rb:648:in `block in load_config_initializer'

为了实现这个功能,我遵循了recaptcha gem的文档https://github.com/ambethia/recaptcha

在我的gemfile中,我有: -

gem 'dotenv-rails', require: 'dotenv/rails-now'
gem 'recaptcha', require: 'recaptcha/rails'

在我的.env文件中(位于根文件夹中)我有: -

RECAPTCHA_SITE_KEY= xxxxxxxxxxxxxxxxxxxxxxxxxx
RECAPTCHA_SECRET_KEY= xxxxxxxxxxxxxxxxxxxxxxxxx

我在config / initializers / recaptcha.rb中有这个: -

Recaptcha.configure do |config|
  config.site_key  = ENV['RECAPTCHA_SITE_KEY']
  config.secret_key = ENV['RECAPTCHA_SECRET_KEY']
end

在视图中我有: -

    .
    .
    .
    <%= f.label :content %>
    <%= f.text_area :content, class: 'form-control' %>
    <br>
    <%= recaptcha_tags %>
    <br>
    <div class="actions">
      <%= f.submit "Send", class: "btn btn-primary center-block" %>
    </div>
  <% end %>
  .
  .
  .

在我的控制器中,我有: -

  def create
    @message = Message.new(message_params)
    if !verify_recaptcha(model: @message) && @message.valid?
    .
    .
    .

从错误中我可以看出,初始化程序没有加载。我不是初始化器的专家,所以我不知道它们是如何加载的,或者我需要做些什么才能让它们加载。

1 个答案:

答案 0 :(得分:2)

但你不需要宝石。 你像这样渲染recaptcha 1)导入Google脚本

<script src="https://www.google.com/recaptcha/api.js" async defer></script>

2)在你感兴趣的形式中放入一个具有适当类的div

<form action="?" method="POST">
      <div class="g-recaptcha" data-sitekey="
<%=Rails.secrets.recaptcha_key%>"></div>
      <br/>
      <input type="submit" value="Submit">
</form>

然后在你的控制器中验证,只需发一个帖子请求

if valid_captcha?(params['g-recaptcha-response']) && @user.save

其中

def valid_captcha?(recaptcha_response)
    return true if Rails.env.test?

    HTTParty.post(
      Rails.application.secrets.recaptcha_url,
      body: {
        secret: Rails.application.secrets.recaptcha_secret_key,
       response: recaptcha_response
    })["success"]
end