Pregunta enlazar múltiples objetos en play framework 2.0 desde un formulario


Estoy tratando desesperadamente de recibir una lista de valores de un envío de formulario y vincularlo a una lista de objetos.

Lo que funciona es 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 tipo tarea 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.get ahora falla

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


5
2018-04-18 22:09


origen


Respuestas:


Bueno, gracias por darme una pista para que vuelva a mirar los documentos, 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 funcionando después de darle un 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 finalmente haz un:

val tasks = taskForm.bindFromRequest.get

para recuperar la lista de tareas.


17
2018-04-19 07:26



De la documentación de playframework página:

Valores repetidos

Un mapeo de formulario también puede definir valores repetidos:

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

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

Cuando usa datos repetidos como este, los valores de formulario enviados por   el navegador debe llamarse correos electrónicos [0], correos electrónicos [1], correos electrónicos [2], etc.


1
2018-04-19 00:05