Creando Encuestas en Rails con Rapidfire

En Rails crear un sistema de encuestas no es complejos, sin embargo crear un sistema donde los mismos usuarios creen estos formularios puede llegar a hacer bastante trabajo debido a todas los posibles opciones que existen, como por ejemplo agregar alternativas múltiples, respuestas únicas, respuestas cortas, largas, etc.

Por suerte existe una gema en Rails que nos permite crear estos formularios de forma automática, y esta gema es Rapidfire https://github.com/code-mancers/rapidfire

Rapidfire es un Engine, o sea una microaplicación que cargaremos dentro de nuestro sistema, esto tiene ventajas y desventajas, la ventaja es que es que muy fácil de cargar, todos los elementos tienen su propio namespace y no afectará el resto de la aplicación, la desventaja es que un poco más difícil de modificar y adaptar a nuestras necesidades.

Paso 0

Setup

Antes de empezar necesitamos un proyecto creado con devise (u otro sistema), para registrar los usuarios que contestan las encuestas, además necesitaremos tener definido un perfil de admin, en este ejercicio tendremos un campo booleano en el usuario, pero es perfectamente posible generar el control de accesos con cancancan u otro sistema.

rails g migrate addAdminToUser admin:boolean

Para realizar las pruebas necesitaremos al menos un usuario que sea administrador y uno que no lo sea.

Paso 1

Gema migraciones y rutas

Con la aplicación base construida (devise + perfil administrador),
Lo primero que tenemos que hacer para crear el sistema de encuestas es agregar rapidfire a nuestro gemfile

gem rapidfire

Luego en el terminal:

bundle install

Con la gema instalada lo que tenemos que hacer a continuación es crear y correr las migraciones para nuestro sistemas de encuesta

rake rapidfire:install:migrations
rake db:migrate

Con las migraciones corridas, el siguiente paso es montar el Engine

mount Rapidfire::Engine => "/rapidfire"

Ahora para crear nuevas encuestas simplemente tenemos que entrar a localhost:3000/rapidfire

(Aunque si lo hacemos en este momento tendremos algunos conflictos por el tema de usuario y administrador)

Para ver todas las rutas creadas podemos hacer rake routes, lo cual nos devolverá todo lo agregado por RapidFire.

rapidfire routes

Paso 2

Seguridad

Rapidfire viene con un sistema de control de acceso que es bien fácil de modificar, necesitamos definir un current_user para registrar quienes son los que contestan las encuesta y un administrador que puede administrar las encuestas.

  class ApplicationController < ActionController::Base

    def can_administer?
      current_user.try(:admin?)
    end
  end

El método current_user no es necesario definirlo si estamos ocupando devise, y para administrar las encuestas recordemos que estamos usando en el modelo de usuario un campo booleano llamado admin.

Paso 3

Resultados

Cuando entramos como admin a localhost:3000/rapidfire tendremos la opción de crear un grupo de preguntas, un grupo de preguntas es el equivalente a decir una encuesta.

grupos de pregunta

Dentro del grupo de preguntas podemos crear preguntas, en cada pregunta se puede especificar los tipos de respuesta, por ejemplo si son radios, checkbox, un solo input largo (text area), etc.pregunta

Cuando uno usuario contesta un grupo de preguntas lo que hace es generar un grupo de respuestas, este grupo de respuestas guarda el user_id de quien lo contestó.

Paso 4

Agregando estilo

Podemos personalizar las vistas creadas con rapidfire si las generamos, eso lo podemos lograr desde el terminal con:

bundle exec rails generate rapidfire:views

Los archivos generados los podemos modificar a nuestro gusto, y listo tenemos un sistema de encuestas dinámico donde los mismos usuarios pueden crear y contestar.