完整的解决方案,一步一步:
这里的其他答案不再有效,因为 recaptcha gem 已更新,您可以查看here。这就是我在 Rails 6 应用程序中逐步使用 recaptcha 的方式。
第 1 步:将 gem 放入您的 Gemfile:
gem 'recaptcha'
如果您使用 gems figaro(如我的例子)或 dotenv 来存储 Env 变量,您需要将 recaptcha gem 放在这两个 gem 的声明下方。
第 2 步:获取验证码 APY 密钥:
转到属于 Google 的 reCAPTCHA admin console 页面,获取一个用于生产和另一个用于开发的 reCAPTCHA API 密钥(稍后您将了解原因)。暂时将所有这些信息复制到安全的地方。为了在这件事上有一些顺序,因为将来您可能需要其他几个重新验证密钥,您应该为这些重新验证密钥的标签遵循某种独特的符号。例如我的个人网站,所以我称它们为 reiniergarcia_production 和 reiniergarcia_development。
您需要在此处选择要使用的特定类型的验证码。一种recaptcha 的API 密钥不适用于另一种recaptcha。在我的例子中,我使用了 v2 Checkbox 类型(上面写着:“我不是机器人”)。
步骤#3:将recaptcha APY密钥存储在rails上:
在我的例子中,我使用 Figaro 将我的环境变量存储在 rails 上,所以这是我在 config/application.yml 中输入的内容:
production:
recaptcha_site_key: 'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww'
recaptcha_secret_key: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
development:
recaptcha_site_key: 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy'
recaptcha_secret_key: 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz'
第 4 步: 添加 Recaptcha 初始化程序:
我添加了文件 config/initializers/recaptcha.rb 并在里面放置了:
Recaptcha.configure do |config|
# New configuration format:
config.site_key = Figaro.env.recaptcha_site_key
config.secret_key = Figaro.env.recaptcha_secret_key
end
这是新配置。请注意,现在它是 site_key 和 secret_key(不再是 public_key 或 private_key)。 Figaro 将根据环境动态加载正确的密钥。就我而言,我部署到 Heroku,但别担心,因为我很快就会到达那里。
第 5 步:在表单中放置 recatcha 标签:
这就是我在我的案例中所做的:
<%= form_with(model: contact, local: true) do |form| %>
<%= hidden_field_tag :return_to, return_to %>
<%= form.text_field :name, placeholder: 'Name', autofocus: false %>
<%= form.email_field :email, placeholder: 'Email', autofocus: false %>
<%= form.text_field :subject, placeholder: 'Subject', autofocus: false %>
<%= form.text_area :message, placeholder: 'Message', autofocus: false, disabled: false %>
<div class="row">
<div class="col-md-6">
<div style="margin-top: 14px;">
<%= recaptcha_tags %>
</div>
</div>
<div class="col-md-6 submit-button">
<%= form.submit "SEND", name: "send" %>
</div>
</div>
<% end %>
第 6 步: 为您的 recaptcha 标签设置样式:
您可能需要在前端(为 recaptcha_tags 帮助程序生成)中设置 recaptcha 标签的位置和/或大小。这就是我在我的案例中所做的:
我添加了文件 app/assets/stylesheets/recaptcha_tags.scss :
.g-recaptcha {
transform: scale(0.6);
transform-origin: 0 0;
}
它允许首先减小recaptcha 标签的大小(非常有用,因为recaptcha 标签通常太大)。在您的情况下,如果您需要添加进一步的样式,您应该将它放在那里,而不是与您的其余 css 代码混合。导入该样式文件的方法是在 app/assets/stylesheets/application.scss 处添加以下内容:
// Imports the recaptcha_tags styling:
@import "recaptcha_tags";
旁注:
如果您要使用多个布局,则每个布局都应该有一个主 .scss 文件,并且在每个布局上您将只导入该特定布局所必需的内容(仅那些额外的 .scss 严格必要) .
第 7 步:添加 verify_recaptcha 逻辑:
您需要在相应控制器的正确操作中添加 verify_recaptcha 逻辑。就我而言,我只想在用户“不是机器人”的情况下保留一个 Contact 对象,所以这就是我在 app/controllers/contacts_controller.rb 中所做的:
def create
@contact = contact_service.build_contact(contact_params)
if verify_recaptcha(model: @contact) && @contact.save
redirect_notice = t('contacts.send.success_notice')
redirect_to @return_to, notice: redirect_notice
else
flash[:alert] = @contact.errors.full_messages.first
redirect_to @return_to
end
end
如果用户没有点击“我不是机器人”,它会在我的页面上显示一个 flash 错误。
第 8 步: 放置环境。服务器中的变量:
正如我之前所说,我使用的是 Heroku。所以我只是去了我在 Heroku 中的仪表板,然后我点击了我的项目,稍后在 Settings 选项卡中,然后在一个按钮中显示:“Reveal Config Vars”。然后我将在最后添加以下对(仅限键和值):
recaptcha_site_key: 'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww'
recaptcha_secret_key: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
如你所见,我只添加了生产验证 APY 密钥。
您可以在终端上执行相同的操作:
$ heroku config:set recaptcha_site_key=wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
$ heroku config:set recaptcha_secret_key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
第 9 步:将所有这些更改推送到 Github:
$ git push origin master
第 10 步:再次部署到 Heroku:
$ git push heroku master
就是这样。如果您按照这些步骤操作,您的验证码也应该可以在您的生产网站上完美运行。我希望它有用。