乐者为王

Do one thing, and do it well.

用simple_captcha插件实现验证码

simple_captcha是一个可以帮我们在Rails中轻松实现验证码功能的插件,它使用简单,并且支持图片和数字验证。

安装插件

1
2
3
script/plugin install git://github.com/eshopworks/simple_captcha.git
rake simple_captcha:setup
rake db:migrate

在config/routes.rb中添加:

1
map.simple_captcha '/simple_captcha/:action', :controller => 'simple_captcha'

在app/controllers/application_controller.rb中添加:

1
2
ApplicationController < ActionController::Base
  include SimpleCaptcha::ControllerHelpers

验证方式有两种:基于控制器和基于模型。这里使用后者作为示例。

在app/views/entries/new.html.erb的form中加上:

1
<%= show_simple_captcha(:ojbect => 'entry', :label => 'Please type the text from the image.') %>

在app/models/entry.rb中添加:

1
2
class Entry < ActiveRecord::Base
  apply_simple_captcha

将app/controllers/entries_controller.rb中的create方法里的

1
if @entry.save

改为

1
if @entry.save_with_captcha

2011/2/17更新

当看不清楚,需要换个验证码时稍麻烦,需要借助Ajax实现,simple_captcha没有提供这个功能,还好小日本写好了一段代码可以参考:http://d.hatena.ne.jp/kusakari/20080130/1201666383 。不过可惜使用的是Prototype库,花了点时间将它改成了jQuery代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<div id="captcha_image">
  <%= show_simple_captcha(:object => 'entry', :label => 'Please type the text from the image.') %>
</div>
<a href="javascript:void(0);" id="recognize_captcha">I cannot recognize.</a>
<script type="text/javascript">
  $("#recognize_captcha").click(function() {
    $.ajax({
      url: "<%= url_for(:action => 'update_captcha') %>",
      success: function(response) {
        $("#captcha_image").html(response);
      }
    });
  });
</script>

在app/controllers/entries_controller.rb中加上:

1
2
3
def update_captcha
  render :layout => false
end

创建app/views/entries/update_captcha.html.erb,代码如下:

1
<%= show_simple_captcha(:object => "entry", :label => 'Please type the text from the image.') %>

还有就是要在routes.rb中添加个映射,不然会找不到action:

1
map.update_captcha '/update_captcha', :controller => 'entries', :action => 'update_captcha'

Comments