107339ea9e | ||
---|---|---|
app/controllers/ru_captcha | ||
config | ||
lib | ||
spec | ||
.gitignore | ||
.travis.yml | ||
CHANGELOG.md | ||
Gemfile | ||
Gemfile.lock | ||
LICENSE | ||
README.md | ||
Rakefile | ||
rucaptcha.gemspec |
README.md
RuCaptcha
This is a Captcha gem for Rails Applications. It runs an ImageMagick command to draw Captcha image - so it has NO performance issues or memory leak issues. There is NO: RMagick
Example
Idea by: https://ruby-china.org/topics/20558#reply4
Feature
- Only need
ImageMagick
, NoRMagick
, Nomini_magick
; - For Rails Application;
- Simple, Easy to use;
- File Caching for performance.
Requirements
- ImageMagick 6.9+
Ubuntu
sudo apt-get install imagemagick ghostscript
Mac OS X
brew install imagemagick ghostscript
Usage
Put rucaptcha in your Gemfile
:
gem 'rucaptcha'
Create config/initializers/rucaptcha.rb
RuCaptcha.configure do
# Number of chars, default: 4
self.len = 4
# Image font size, default: 45
self.font_size = 45
# Cache generated images in file store, this is config files limit, default: 100
# set 0 to disable file cache.
self.cache_limit = 100
# Custom captcha code expire time if you need, default: 2 minutes
# self.expires_in = 120
# Color style, default: :colorful, allows: [:colorful, :black_white]
# self.style = :colorful
# [Requirement]
# Store Captcha code where, this config more like Rails config.cache_store
# default: Rails application config.cache_store
# But RuCaptcha requirements cache_store not in [:null_store, :memory_store, :file_store]
self.cache_store = :mem_cache_store
end
Edit config/routes.rb
, add the following code:
Rails.application.routes.draw do
...
mount RuCaptcha::Engine => "/rucaptcha"
...
end
Controller app/controller/account_controller.rb
class AccountController < ApplicationController
def create
@user = User.new(params[:user])
if verify_rucaptcha?(@user) && @user.save
redirect_to root_path, notice: 'Sign up successed.'
else
render 'account/new'
end
end
end
TIP: Sometime you may need keep last verified captcha code in session on
verify_rucaptcha?
method call, you can usekeep_session: true
. For example:Verify_rucaptcha? (@user, keep_session: true)
.
View app/views/account/new.html.erb
<form>
...
<div class="form-group">
<%= rucaptcha_input_tag(class: 'form-control', placeholder: 'Input Captcha') %>
<%= rucaptcha_image_tag(alt: 'Captcha') %>
</div>
...
</form>
And if you are use Devise, you can read this to add validation: RuCaptcha with Devise.
Write your test skip captcha validation
for RSpec
describe 'sign up and login', type: :feature do
before do
allow_any_instance_of(ActionController::Base).to receive(:verify_rucaptcha?).and_return(true)
end
it { ... }
end
for MiniTest
class ActionDispatch::IntegrationTest
def sign_in(user)
ActionController::Base.any_instance.stubs(:verify_rucaptcha?).returns(true)
post user_session_path \
'user[email]' => user.email,
'user[password]' => user.password
end
end