2012-04-18 8 views
5

sto provando disperatamente a ricevere un elenco di valori da un modulo di invio e associarlo a un elenco di oggetti.associare più oggetti in Play Framework 2.0 da un modulo

Ciò che funziona è quello di recuperare una singola riga:

//class 
case class Task(name: String, description: String) 

val taskForm: Form[Task] = Form(
    mapping(
    "name" -> text, 
    "description" -> text 

)(Task.apply)(Task.unapply) 
) 


//form 
<tr> 
    <td><input name="name" type="text" class="span2" placeholder="Name..."></td> 
    <td><textarea name="description" class="autoexpand span7" rows="1"  placeholder="Description..."></textarea> 
    </td> 
</tr> 

//receiving action: 
val task = taskForm.bindFromRequest.get 

Ma ora voglio presentare più oggetti di tipo di attività in questo modo, per esempio:

<tr> 
    <td><input name="name[0]" type="text" class="span2" placeholder="Name..."></td> 
    <td><textarea name="description[0]" class="autoexpand span7" rows="1" placeholder="Description..."></textarea></td>     
</tr> 
<tr> 
    <td><input name="name[1]" type="text" class="span2" placeholder="Name..."></td> 
    <td><textarea name="description[1]" class="autoexpand span7" rows="1" placeholder="Description..."></textarea></td>     
</tr> 

Facendo un taskForm.bindFromRequest. get ora fallisce.

Qualcuno ha trovato una soluzione a questo? O gestisci una situazione del genere totalmente diversa?

risposta

17

Bene, grazie per avermi suggerito di guardare di nuovo i documenti, li ho già visti, ma non ho mai potuto inventare come combinarlo per farlo funzionare. Penso che questo sia perché sono uno zero noob totale. Tuttavia, ho capito di lavoro dopo aver dato di nuovo un po 'di tempo, questa è la mia soluzione:

//classes 
case class Task(name: String, description: String) 
case class Tasks(tasks: List[Task]) 

val taskForm: Form[Tasks] = Form(
    mapping(
    "tasks" -> list(mapping(
    "name" -> text, 
    "description" -> text 
)(Task.apply)(Task.unapply)) 
)(Tasks.apply)(Tasks.unapply) 
) 

//form 
<tr> 
    <td><input name="tasks[0].name" type="text" class="span2" placeholder="Name..."></td> 
    <td><textarea name="tasks[0].description" class="autoexpand span7" rows="1" placeholder="Description..."></textarea></td>     
</tr> 
<tr> 
    <td><input name="tasks[1].name" type="text" class="span2" placeholder="Name..."></td> 
    <td><textarea name="tasks[1].description" class="autoexpand span7" rows="1" placeholder="Description..."></textarea></td>     
</tr> 

E infine fare un:

val tasks = taskForm.bindFromRequest.get 

per recuperare l'elenco delle attività.

+0

Wow l'hai inchiodato. Per quelli là fuori che hanno avuto problemi, la parte che mi ha procurato è stata la compilazione di 'list()' attorno a una sottorubrica – crockpotveggies

+1

Ma che ne dici di unire un elenco dello stesso tipo di oggetto? (qualcosa del tipo: classista Persona (nome: String, amici: Elenco [Persona])?) – teo

+0

Questo è grandioso, ma che ne dici di fare questo da Java? Il framework Java più rudimentale lo fa con facilità. Scioccato questo non è lì in gioco. – Rob

1

Dalla documentazione play framework page:

valori ripetuti valori

Una mappatura modulo può anche definire ripetuti:

case class User(name: String, emails: List[String]) 

val userForm = Form(
    mapping(
    "name" -> text, 
    "emails" -> list(text) 
)(User.apply, User.unapply) 
) 

Quando si utilizza i dati ripetuti come questo, il i valori del modulo inviati da il browser devono essere denominati e-mail [0], e-mail [1], e-mail [2], ecc.

+0

il down-voter può commentare? – mericano1

Problemi correlati