Simple Captcha in rails 3
Here I will show you how to add captcha in rails 3 application:
Download Simple captcha plugin from the git : click here
rails plugin install https://github.com/galetahub/simple-captcha.git
Generate Simple Captcha
rails generate simple_captcha
rake db:migrate
Generate scaffold of MODEL
rails g scaffold Model
Captcha code can be added two way . 1. Controller based 2. Model based
Controller Based
Include simple captcha in app/controllers/application.rb
ApplicationController < ActionController::Base
include SimpleCaptcha::ControllerHelpers
end
Add captcha code in form page
<%=show_simple_captcha%>
Check captcha authentication in controller
def create
if simple_captcha_valid?
do something....
else
do something....
end
end
Model Based
Add captcha in model
class Model < ActiveRecord::Base
apply_simple_captcha
end
In Form page
<%= show_simple_captcha( :label => "human authentication",:object => "object") %>
In controller
@object.valid_with_captcha?
or
@object.save_with_captcha
ADD I18n
simple_captcha:
message:
default: "Secret Code did not match with the Image"
user: "The secret Image and code were different"
If application is in ruby 1.9.* then you need to require some changes in plugins otherwise you will not able to see captcha image and get following error
"TypeError (can't convert nil into Integer):"
Changes in /simple-captcha/lib/simple_captcha/image.rb
At line number 47: Comment class Tempfile
#class Tempfile < ::Tempfile
# Replaces Tempfile's +make_tmpname+ with one that honors file extensions.
# def make_tmpname(basename, n = 0)
# puts "**********************Base name: #{basename}"
# extension = File.extname(basename)
# puts "**********************Extension: #{extension}"
# puts "********************** SPRINFG #{File.basename(basename, extension)},#{$$},#{n.to_i}#{extension}"
#
# # sprintf("%s,%d,%d%s", File.basename(basename, extension), $$, n, extension)
# sprintf("%s%d-%d%s", File.basename(basename, extension), $$, n, extension)
# #"%s,%d,%d%s", File.basename(basename, extension), $$, n, extension
# puts "**********************Base name: #{basename}"
# end
# end
At line number 68: replace with below code
dst = Tempfile.new(['simple_captcha','.jpg'])
Hope this helps to solve above problem in rails 3.