Hace unos meses implementé un sistema para generar captchas para el formulario de comentarios del blog y así evitar el spam que me estaba llegando. El “problema” de la solución a la que llegué era que no hacía ningún uso de las facilidades que ofrece Rails para crear plugins, por lo que la reutilización de todas las librerías se hacía un tanto ortopédica ya que obligaba a estar repitiendo código por todos lados. Por eso y para seguir trasteando con ruby, convertí todo el sistema en un plugin para RoR.
Para instalarlo basta con ejecutar el siguiente comando en nuestra aplicación Rails:
ruby script/plugin install http://svn.dagi3d.net/rails/rcaptcha/tags/rcaptcha-0.1.2
A continuación hay que llamar al método de clase ‘acts_as_captchable’ dentro de nuestro controlador. También se le pueden pasar parámetros para modificar la apariencia del captcha(son todos opcionales):
app/controllers/foo_controller.rb:
class FooController < ApplicationController
acts_as_captchable :length => 5, #número de caracteres del captcha
:width => 300, #ancho de la imagen generada
:height => 30, #altura de la imagen generada
:step => 10, #ancho de las celdas de la rejilla de la imagen
:font_color => 'black', #color del texto. también admite valores hexadecimales
:font_size => 25 #tamaño de la fuente
def index
end
def validate_form
render_text(valid_captcha_value?(params[:captcha_value]))
end
end
Con el plugin también se crea automágicamente el helper ‘image_captcha_tag’ para pintar la imagen con el captcha. Hay que indicarle en el primer parámetro el nombre del controlador que se encargará de generar el captcha(al que hemos marcado como ‘captchable’). Opcionalmente se le puede pasar los atributos que queramos para el tag ‘img’ que se renderizará en la vista:
app/views/foo/index.rhtml:
<html>
<body>
<%= form_tag(:action => "validate_form") %>
<%= image_captcha_tag("foo", :class => "captcha") %>
<%= text_field_tag(:captcha_value) %>
<%= submit_tag('enviar') %>
</form>
</body>
</html>
Finalmente, para comprobar si el valor enviado en el formulario coincide con el generado por el captcha, basta con llamar al método ‘valid_captcha_value?’ pasándole como parámetro el valor introducido en el textfield, tal como se indica en la clase FooController.
El resultado final con los valores por defecto sería algo así:

Me ha ido muy bien para mi web ya que últimamente me llegaban demasiados comentarios basura.
Para que me funcionase he instalado el ImageMagick, luego he instalado el gem RMagick para que Ruby se entienda con el ImageMagick y luego he reiniciado el Windows.