Questionario con Rails

Salve lista.
Devo realizzare un questionario con una novantina di domande, alle quali
si dovrà rispondere con “sì”, “no”, “non so”… in pratica la versione
informatica di quello stampato su cui fare le crocette sulle caselle.
Tanto per capire cos’è, si tratta del questionario da far fare ai
dipendenti per le normative sulla sicurezza, quindi ci sono domande
tipo: “La sedia va bene?” Il tavolo è di almeno @altezza_minima?", “Ci
sono riflessi carogna sul monitor?” e via così. L’utente risponderÃ
selezionando uno di tre radio button per domanda, ma non ho ben capito
come realizzare la cosa.
Per semplificare le cose il più possibile, ho pensato di mettere le
domande su una tabella (questions, con campi “id” e “domanda”), fare un
sistema di autenticazione (i dati poi saranno anonimizzati, però dovrÃ
essere esposto in internet, quindi si deve evitare che cani e porci si
divertano) e raccogliere le risposte su un’apposita tabella (answers,
con id, user_id, question_id e risposta), nella quale comparirà l’id
della domanda e il valore della risposta (tipo 1 = sì, 0 = no, 2 = non
so).
La view del questionario quindi è una cosa del genere:

<% for question in @questions %> <% end %>
<%= question.id %> <%= question.domanda %> <%= radio_button( :answer, :risposta, value="0" )%> <%= radio_button( :answer, :risposta, value="1" )%> <%= radio_button( :answer, :risposta, value="2" )%>

Naturalmente non funziona, perché mi trovo tutti i radio button
correlati, invece di essere a tre a tre per domanda.

Qualcuno ha suggerimenti su come procedere per “isolare” i radio button
tra le domande?

Grazie in anticipo :slight_smile:

Bhe… non conosco com’è fatta l’app però se fai

<%= radio_button( :answer, :risposta, value="1" )%> <%= radio_button( :answer, :risposta2, value="2" )%>

i due radio stampati dovrebbero essere indipendenti

2009/5/14 Daneel O. [email protected]

Sandro P. wrote:

Bhe… non conosco com’� fatta l’app per� se fai

<%= radio_button( :answer, :risposta, value="1" )%> <%= radio_button( :answer, :risposta2, value="2" )%>

i due radio stampati dovrebbero essere indipendenti

Praticamente è solo quella pagina, devo raccogliere le risposte alle
domande e basta, quindi nella tabella risposte dovrei avere una cosa del
genere:

id|user_id|question_id|risposta|
1 |1 |1 |0 |
2 |1 |2 |1 |
3 |1 |3 |1 |
4 |1 |4 |2 |

95|2 |1 |2 |
96|2 |2 |0 |
97|2 |3 |1 |
97|2 |4 |1 |

ecc.

quindi è corretto che siano tutti associati a “:risposta”, altrimenti
dovrei fare 94 (o quante saranno) colonne solo per il valore delle
risposte, il che non è il massimo :slight_smile:
Il mio problema è che come ho fatto posso avere UN SOLO radio button
attivo in tutta la pagina, mentre dovrebbero gestirsi di tre in tre per
ogni singola domanda… non so come spiegarmi meglio, ora vado a
mangiare e in caso richiedete, magari a stomaco pieno mi viene in mente
una spiegazione più decente.

ahh… hai provato a dare un occhiata alle nested forms ?(perchè in
realta
tu stai facendo una form su di una collezione di
oggetti - le domande )

2009/5/14 Daneel O. [email protected]

Premesso che non sono (ancora) padrone di rails, posso solo provare a
consigliarti un possibile approccio =)

per ottenere il risultato che vuoi, potresti creare i value che
contengano
sia il valore della risposta che l’id della domanda.
magari non è un esempio di eleganza, ma se ad esempio il value di un
radio_button fosse impostato con

value=“valore_risposta id_domanda”

poi dovresti splittare i valori quando arriva la richiesta… sono
sicuro
che esitono metodi più eleganti con rails, ma se hai fretta e sai giÃ
che il
traffico non è eccessivo, tutto sommato è una soluzione rapida =P

ciao,
A.

Il giorno 14 maggio 2009 13.09, Daneel O.
[email protected] ha
scritto:

<% for question in @questions %> <% end %>
<%= question.id %> <%= question.domanda %> <%= radio_button( :answer, :risposta, value="0" )%> <%= radio_button( :answer, :risposta, value="1" )%> <%= radio_button( :answer, :risposta, value="2" )%>

Forse l’errore che hai fatto inizialmente sta nel fatto che il tag di
chiusura della riga l’hai messo fuori del ciclo for mentre
l’apertura è dentro!

Luigi

Nested forms: mai sentite, ora approfondisco, grazie :slight_smile:

Poi:

Andrea P. wrote:

Premesso che non sono (ancora) padrone di rails, posso solo provare a
consigliarti un possibile approccio =)

per ottenere il risultato che vuoi, potresti creare i value che
contengano
sia il valore della risposta che l’id della domanda.
magari non è un esempio di eleganza, ma se ad esempio il value di un
radio_button fosse impostato con

value=“valore_risposta id_domanda”

poi dovresti splittare i valori quando arriva la richiesta… sono
sicuro
che esitono metodi più eleganti con rails, ma se hai fretta e sai giÃ
che il
traffico non è eccessivo, tutto sommato è una soluzione rapida =P

ciao,
A.

No, non funzionerebbe perché non riesco a selezionare i radio button in
maniera autonoma per le domande.
In teoria dovrei avere la domanda e poi i tre radio button per “Sì”,
“No” e “Forse”, poi sotto la domanda successiva con di nuovo i tre
radiobutton e via così.
Dovrebbe essere possibile selezionare un solo radio button per domanda
(quindi si avrà per esempio la prima con valorizzato “No”, la seconda
con “Sì”, ecc.), ma in pratica così come ho fatto posso selezionare un
radio button in tutta la pagina composta dalle 94 domande e dai 94 X 3
radio button, cioè se nella domanda 1 seleziono “Sì”, quando passo alla
seconda premendo su un qualsiaso radio button mi deseleziona quello
della 1, se premo su uno della 3 fa lo stesso… in pratica è possibile
selezionare un solo radio button in tutta la pagina; evidentemente li
vede correlati tutti. Ora provo con le nested forms… speriamo di
capire come funzionano ':slight_smile:

Ok, leggendo la tua risposta (e rileggendo la mia…) temo di aver detto
una
boiata =P

potresti giocare con l’HTML per creare una “label” che contenga la
domanda, mentre i radio-button devono distinguersi con l’attributo
“name”
che deve essere in comune.

Non avendo ancora moltissima esperienza con le view di rails, non so
quale
html viene generato con il codice che hai postato nel tuo esempio.

Ad ogni modo, è probabile che tu possa selezionare 1 solo radio-button su
94
proprio perchè evidentemente non hai raggruppato i radio-button relativi
ad
una singola domanda, con un “name” personalizzato.

Prendendo un esempio con una form compostya da radio-buttons in html,
ecco
come dovrebbe apparire:
Domanda 1
Risposta 1

Risposta 2

Risposta 3


Domanda 2 Risposta 1
Risposta 2
Risposta 3

se riesci a generare l’HTML con questa formattazione, otterrai le tue 94
domande con le relative N risposte associate =)

spero che questa volta ti sia stato utile :slight_smile:
A.

Il giorno 14 maggio 2009 13.49, Daneel O.
[email protected] ha
scritto:

spero che questa volta ti sia stato utile :slight_smile:
A.

Anch’io, ora ci smanetto un po’ :slight_smile:

Risultato, ecco il codice:

<% for question in @questions %>

<%= question.domanda %>
Sì
No
Forse


<% end %>

E l’html:

Ritiene che il suo posto di lavoro sia adeguato e
soddisfacente?
Sì
No
Forse


Sono chiaramente assegnati i compiti e individuate
le responsabilità ?

Sì
No
Forse


...

E sembra funzionare; ora bisogna salvare i dati.

Daneel O.

non capisco quel name=“answer[risposta]” =P che valore avrebbe quando
processerai i valori della form inviati a rails?

almeno in PHP, quando invii la form, hai un hash contentente i “name”
come
chiave, ed i “value” come valore. in rails se non sbaglio il meccanismo
è
molto simile (non potrebbe essere altrimenti =P)

ho fatto un paio di prove al volo, in questo modo funzia come vorresti:

1 [questo è l'id della domanda] Ritiene che il suo posto di lavoro sia adeguato e soddisfacente? 2 Sono chiaramente assegnati i compiti e individuate le responsabilità?

ho solo un dubbio sugli id identici nei vari gruppi di radio-button,
credo
siano un errore di HTML, al massimo se non devi lavorarci con ajax puoi
ometterli, lasciando solo i campi “name” :smiley:

un altro consiglio è quello di mettere l’id della domanda all’interno
dell’attributo id nel TD che contiene il testo della domanda, ti
risparmi N
righe nella tabella html e forse anche qualche noia con l’impaginazione
tramite CSS =P

dai che questa volta è quella buona :slight_smile:
A.

Il giorno 14 maggio 2009 14.35, Daneel O.
[email protected] ha
scritto:

Ci sto lavorando sopra, ma è un po’ più complicato del previsto.
Se qualcuno ha voglia di dare una mano, mi faccia sapere: se anche in
giro funziona come qui da noi, almeno una volta l’anno c’è un
questionario da far fare :slight_smile:

eheheh, fortunatamente no, finchè sono stato in (varie) aziende non mi è mai
capitato, ora sono freelance ^___^

ciao alla prossima =)
A.

Andrea P. wrote:

Ok, leggendo la tua risposta (e rileggendo la mia…) temo di aver detto
una
boiata =P

Io le scrivo anche nel codice, vedi tu… :slight_smile:

[html risultante e altro]
se riesci a generare l’HTML con questa formattazione, otterrai le tue 94
domande con le relative N risposte associate =)

Il mio codice html risulta essere:

1 [questo è l'id della domanda] Ritiene che il suo posto di lavoro sia adeguato e soddisfacente? 2 Sono chiaramente assegnati i compiti e individuate le responsabilità ? ...

Ci sto lavorando sopra, ma è un po’ più complicato del previsto.
Se qualcuno ha voglia di dare una mano, mi faccia sapere: se anche in
giro funziona come qui da noi, almeno una volta l’anno c’è un
questionario da far fare :slight_smile:

spero che questa volta ti sia stato utile :slight_smile:
A.

Anch’io, ora ci smanetto un po’ :slight_smile:

Daneel O.

Daneel O. wrote:

E sembra funzionare; ora bisogna salvare i dati.

Daneel O.

Ma devi crearti un array di risposte e poi ciclare nel controller per
salvarti il risultato, andava benissimo con gli helper:
<% questions.each do |question| %>

<%= question.domanda %> <%= radio_button :answer, "risposta#{question.id}", "0" %> Si
<%= radio_button :answer, "risposta#{question.id}", "1" %> No
<%= radio_button :answer, "risposta#{question.id}", "2" %> Forse
<% end %>

poi nel controller usi:

questionnaire = Questionnaire.new(:user_id=>params[:user_id])
transaction do
  if questionnaire.save
    params[:answer].each do |k, v|
        qm = Questionmodel.find(k.to_i)
        question = Question.new(qm)
        if questionnaire<<question
          answer=Answer.new(:value => v)
          question<<answer
        end
    end
  end
end

Nella tabella questionmodel crei le domande per ogni questionario.
Le relazioni le puoi fare così:
User -> 1a1-> Questionnaire -> 1amolti -> Questions -> 1a1 -> Answer

Ovviamente il codice è da testare
Ciao

mmmhhh… e fare una pagina per domanda? Cosi potresti inserire
schemi/disegni esplicativi rispetto alla domanda.
Spiega che la linea degli occhi, una volta sistemata la seduta, deve
rimanere sopra il bordo del monitor (è una domanda che hanno fatto ad un
collega, sempre nell’ambito della sicurezza).
Potresti, cosi facendo, utilizzare ajax. Cosi non si potrebbe neppure
navigare avanti e in dietro per le domande.

Ciao Michele.

è un punto di vista interessante =) ma fare un questionario da 94 pagine
vanifica gli sforzi per renderlo usabile =P

inoltre, da quanto ho potuto capire, è un questionario interno, non un
test
per le conoscenze, quindi il fattore motivazionale dell’intervistato,
probabilmente già scoglionato per il doversi sciroppare una sfilza di
domande per uno scopo poco chiaro ai suoi occhi, potrebbe peggiorare
l’attendibilità dei risultati.

nella migliore ipotesi, per non spaventare l’intervistato, si potrebbero
raggruppare le domande in gruppi contestuali (soddisfazione,
motivazione,
etc…) e dilazionarle su massimo 4-5 pagine

A.

Il giorno 14 maggio 2009 16.06, Michele C. [email protected] ha
scritto: