2012-04-18 9 views
5

estoy tratando desesperadamente de recibir una lista de valores de un envío de formulario y vincularlo a una lista de objetos.enlazar varios objetos en el marco de trabajo 2.0 desde un formulario

lo que funciona es para recuperar una sola fila:

//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 

Pero ahora quiero enviar varios objetos de la tarea tipo como este por ejemplo:

<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> 

Haciendo un taskForm.bindFromRequest. obtener ahora falla.

¿Alguien ha encontrado una solución para esto? ¿O manejas esa situación totalmente diferente?

Respuesta

17

Bien, gracias por hacerme alusión para ver los documentos otra vez, ya los he visto, pero nunca pude inventar cómo combinarlos para que funcionen. Creo que esto es porque soy un scala noob total. Sin embargo, lo tengo trabajo después de dar un poco de tiempo de nuevo, esta es mi solución:

//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> 

Y, por último hacer un:

val tasks = taskForm.bindFromRequest.get 

para recuperar la lista de tareas.

+0

Wow lo has clavado. Para aquellos por ahí que estaban teniendo problemas, la parte que me consiguió fue envolviendo 'list()' alrededor de un sub-mapa – crockpotveggies

+1

Pero, ¿qué tal unir una lista del mismo tipo de objeto? (algo así como: clase de caso Persona (nombre: cadena, amigos: lista [persona])?) – teo

+0

Esto es genial, pero ¿qué hay de hacer esto desde Java? El marco Java más rudimentario lo hace con facilidad. Sorprendido, esto no está en Play. – Rob

1

De la documentación playframework page:

valores repetidos valores

Una asignación de formulario también puede definir repetidas:

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

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

Cuando está utilizando los datos repetidos de este tipo, la los valores de formulario enviados por el navegador debe llamarse correos electrónicos [0], correos electrónicos [1], correos electrónicos [2], etc.

+0

¿Puede el votante rehusado comentar? – mericano1

Cuestiones relacionadas