Skip to content

Instantly share code, notes, and snippets.

@alepulver
Created July 28, 2014 19:27
Show Gist options
  • Save alepulver/9743b47f2063a7a83bc6 to your computer and use it in GitHub Desktop.
Save alepulver/9743b47f2063a7a83bc6 to your computer and use it in GitHub Desktop.
Encuesta con Sinatra
require 'sinatra'
require 'haml'
require 'yaml'
# TODO
# - agregar promedio hasta el momento
# - verificar con JS que los forms al comienzo no estén vacíos
# - guardar id en forma incremental (contador)
Encuesta = Struct.new :persona, :paresPuntuados, :ip
class Persona
@@contador = 1
attr_reader :nombre, :edad, :sexo, :educacion, :id
def initialize(nombre, edad, sexo, educacion)
@nombre = nombre
@edad = edad
@sexo = sexo
@educacion = educacion
@id = @@contador
@@contador += 1
end
end
class ListaDePares
attr_reader :palabras
def initialize(archivo, cantidad)
@palabras = File.read(archivo)
.split("\n")
.drop(1)
.map {|s| s.split(',')[0..1].shuffle}
.shuffle
.take(cantidad)
end
end
# mantener sesiones para guardar los datos en medio de la encuesta
use Rack::Session::Pool, :expire_after => 2592000
# por única vez al arrancar, cargar objeto "encuestas"
if File.exists?("db.yaml")
encuestas = YAML.load_file('db.yaml')
else
encuestas = []
end
get '/' do
session[:num_encuesta] = encuestas.size
redirect to ('/datos');
end
get '/datos' do
haml :datos
end
post '/datos' do
session[:persona] = Persona.new(params[:nombre], params[:edad], params[:sexo], params[:educacion])
session[:lista_de_pares] = ListaDePares.new("palabras.csv", 55).palabras
session[:par_actual] = 0
session[:respuestas] = []
redirect to ('/encuesta')
end
get '/encuesta' do
haml :encuesta
end
get '/encuesta/*' do
session[:respuestas] <<
[ session[:lista_de_pares][session[:par_actual]], params[:splat][0].to_f ]
session[:par_actual] += 1
if session[:par_actual] < session[:lista_de_pares].size
redirect to ('/encuesta')
else
encuestas << Encuesta.new(session[:persona], session[:respuestas], request.ip)
File.open('db.yaml', 'w') do |out|
YAML.dump(encuestas, out)
end
redirect to ('/fin')
end
end
get '/fin' do
haml '%h2 Gracias por participar!'
end
get '/resultados' do
res = ""
encuestas.each do |e|
res += "#{e.persona.edad}\t#{e.persona.sexo}\t#{e.persona.educacion}\n"
res += "#{e.persona.nombre}\n"
e.paresPuntuados.each do |p|
res += "#{p[0][0]}\t#{p[0][1]}\t#{p[1]}\n"
end
res += "\n"
end
content_type 'text/plain'
res
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment