2014-04-16 4 views
5

La forma devo gestire ha qualcosa di simile:Come associare un campo di modulo array con play framework scala

<label for="features_1"> 
    <input type="checkbox" id="features_1" name="features[]" value="4"> foo 
</label> 
<label for="features_2"> 
    <input type="checkbox" id="features_2" name="features[]" value="8"> bar 
</label> 

posso ottenere l'allineamento come questo

request.body.asFormUrlEncoded.get("features[]") 

che mi quando entrambi dà gli elementi sono selezionati List(4, 8)

Ma quando provo a legare questo in una forma

case class MyFeatures(features: Seq[Long]) 

val myForm = Form (
    mapping(
     "features" -> seq(longNumber) 
    )(MyFeatures.apply)(MyFeatures.unapply) 
) 

ottengo sempre una sequenza vuota, lo stesso con "caratteristiche []"

EDIT

L'esempio precedente funziona davvero, la questione è stata da qualche altra parte. Al momento del gioco vincolante traduce le caratteristiche di funzionalità [0] = 4 e caratteristiche [1] = 8 che viene poi gestito correttamente nel seq (...) o di un elenco (...) mappature

+1

si può mostrare un po 'più del codice circostante, come come si associa il modulo dalla richiesta. Inoltre, non ci sono funzioni apply/non per myForm? –

+0

Ok, c'è qualcosa di strano, secondo il nome del codice bind del modulo [] dovrebbe essere esteso al nome [0], nome [1] ... Dovrò eseguire il debug un po 'di più. https://github.com/playframework/playframework/blob/2.2.x/framework/src/play/src/main/scala/play/api/data/Form.scala#L90 – Somatik

+0

Ok, il mio problema era totalmente altrove , usando il nome del campo sbagliato nel mio modulo, l'esempio fornito funziona correttamente – Somatik

risposta

6

Prova:

<label for="features_1"> 
    <input type="checkbox" id="features_1" name="features[0]" value="4"> foo 
</label> 
<label for="features_2"> 
    <input type="checkbox" id="features_2" name="features[1]" value="8"> bar 
</label> 

EDIT

Oppure:

myForm.bind(myForm.bindFromRequest.data + ("features"-> request.body.asFormUrlEncoded.get("features[]"))).fold(
... 
) 

Questo si legano tutti gli altri campi di richiesta direttamente, e poi, quando si tratta di caratteristiche, sono andate da aggiungere manualmente. Se non è necessario associare più dati allora basta scrivere:

myForm.bind("features"-> request.body.asFormUrlEncoded.get("features[]")).fold(
... 
) 
+0

Grazie per la proposta ma non ho alcun controllo sulla creazione del modulo e poiché play sembra avere questo inputCheckboxGroup suppongo che ci sia un modo per risolvere questo problema sul backend side – Somatik

+0

Cerca di associare il modulo utilizzando il suggerimento che ho aggiunto nella mia modifica. – Peter

Problemi correlati