Recaptcha サイトから (ほぼ)...私は Devise (明らかにハード バンドル) を使用して Rails 4 を使用しています。いいえ、簡単すぎます。手順は、任意の ruby、任意のレール、およびデバイス (またはデバイスなし) に適用されます。ruby/rails/devise 1.9.3/3.2.x/2.2.1 および 2.0.x/4.0.x/3.2.4 でテスト済み、最後の 1 つは Devise なし。
次のファイルを編集します。
Gemfile
gem 'ruby-recaptcha'
# bundle install
config/initializers/credentials.rb (このパス内の任意のファイルで問題ありません)
# Set constants
RCC_PUB = "your_public_key"
RCC_PRIV= "your_private_key"
# re-start server. Try to keep safety this data using ENV vars.
app/views/devise/registrations/new.html.erb (またはお好みのフォーム)
# form
<%= simple_form_for(resource, as: resource_name, :url => registration_path(resource_name) do |f| %>
<%= f.input :email, autofocus: true, required: true %>
...
<!-- Add next line -->
<div id="captchadiv"></div>
<%= f.button :submit, "Register", class: 'btn btn-danger' %>
<% end %
同じファイルの最後 (awesome_funcs.js.erb ファイルにある可能性があります)
<script type="text/javascript" charset="utf-8">
$(function () {
function showRecaptcha() {
Recaptcha.create("<%= RCC_PUB %>", "captchadiv", {
theme: "white",
lang: 'en'
});
};
showRecaptcha();
});
</script>
ちょっとしたトリック app/controllers/application_controller.rb
# On top
include ReCaptcha::AppHelper
before_action :configure_permitted_parameters, if: :devise_controller?
# If already you have this method or any other with before_filter
# Into method
protected
def configure_permitted_parameters
if controller_name == "registrations" && action_name == "create"
# Rails 3: If you prefer, put this into registrations#create method
unless validate_recap(params, User.new.errors) # Or your model
# wrong input is handled here
flash[:error] = "Text from images doesn't match with your input"
redirect_to :back # or other stuff
# As my submit is with Ajax, I do a render instead redirect:
# render :json => {other: "recaptcha_failed"}
# In success callback I evaluate response and Recaptcha.reload() paints a new recaptcha.
end
end
....
# trick: do everything before params sanitizers
end
Ajax プラグインを使用しているため、最後に app/views/layouts/application.html.erb を追加します (本文の直前)。
<body>
...
...
<script type="text/javascript" src="http://www.google.com/recaptcha/api/js/recaptcha_ajax.js"></script>
</body>
それでおしまい。再キャプチャがあります
アドバイス: Ajax を使用して送信する場合は、画像と入力が一致しない場合に Recaptcha.reload() の成功コールバックを使用できます。
その他、フォームが "remote: true" の場合、ビュー ディレクトリの create.js.erb ファイルで "create" メソッドの後に上記の動作を使用できます。
重要: 一部のプロジェクトでは、フォームがリンクから到着したときに Recaptcha が表示されません。ランチャー リンクを div に配置するか、親 div に「data-no-turbolink」を追加してください。Rails 4でこの問題が発生しました。