Created
July 28, 2014 19:27
-
-
Save alepulver/9743b47f2063a7a83bc6 to your computer and use it in GitHub Desktop.
Encuesta con Sinatra
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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