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.
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.
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.
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.