【问题标题】:uninitialized constant Recaptcha (NameError) while using recaptcha gem for rails app将recaptcha gem用于rails应用程序时未初始化的常量Recaptcha(NameError)
【发布时间】:2017-06-14 09:46:39
【问题描述】:

我正在开发 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?
    .
    .
    .

正如我从错误中看到的,初始化程序没有加载。我不是初始化程序方面的专家,所以我不知道它们是如何加载的,也不知道我需要做什么才能让它们加载。

【问题讨论】:

  • 你做了捆绑安装吗?
  • 几次。我也试过重启服务器。
  • 尝试在初始化文件中要求“recaptcha”
  • 我不知何故让它工作,而不需要'需要'recaptcha''行。我的存储库有问题,因为我在 Dropbox 中有该文件夹。我在 Dropbox 外部的一个新文件夹中从 git 进行了新的提取,现在这个错误消失了,我可以启动 rails 服务器了。但是我在尝试推送到 heroku 时遇到了一个新错误。我在这里开始了一个单独的问题 - stackoverflow.com/questions/44546377/…
  • 如果 Google 在 2019 年 6 月之后因同样的错误将您带到此页面,请注意在 recaptcha v5.0.0 版本中发生的重命名类:github.com/ambethia/recaptcha/blob/master/CHANGELOG.md

标签: ruby-on-rails recaptcha


【解决方案1】:

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

<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

【讨论】:

  • 谢谢你,我实际上是在尝试自己实现它,但不知道如何为验证验证码的控制器方法编写代码。这就是我选择宝石的原因。你的指示是正确的。我必须进行一些重构才能在验证码失败时显示 Flash 消息,但除此之外这很棒。谢谢!
  • @radha 未初始化常量 ContactsController::HTTParty
  • @nourza 确保您已安装 gem github.com/jnunemaker/httparty
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多