2013-06-21 7 views
2

У меня есть форма с повторяющимся поле: Формы воспроизведения: как заполнить повторяющееся поле?

case class MyForm(topics: List[Int]) 
val myForm: Form[MyForm] = Form(
    mapping(
    "topics" -> list(number) 
)(MyForm.apply _)(MyForm.unapply _) 
) 

И соответствующий вид:

@form(...) { 
    <h2>Topics of interest:</h2> 
    @for(Topic(id, name, _) <- Topics.all) { 
    @checkbox(
     bidForm(s"topics[$id]"), 
     '_label -> (name + ":").capitalize, 
     'value -> id.toString) 
    } 
    <input type="submit" id="submit" value="Save"> 
} 

До сих пор так хорошо, если есть ошибка в поле, и я вновь сделать его передача myForm.bindFromRequest.

Я хотел бы предварительно заполнить форму данными из моей базы данных. С другими типами полей (number, text, option() и так далее) я могу населён existingMyForm с чем-то вроде этого:

val existingMyForm = myForm.fill(MyForm(
    // Queries the database and return a list of case classes with field id: Int 
    Topics.of(member).map(_.id) 
)) 

Однако с list этот подход терпит неудачу, и я должен вручную сделать отображение:

val existingMyForm = myForm.bind(
    Topics.of(member).map(t => ("topics[%s]".format(t.id), t.id.toString)).toMap 
) 

Есть ли лучший способ сделать это?

+0

У меня такая же проблема! Вы исправили его? если да, то как? –

+0

Nop, я все еще использую тот же [хак] (https://github.com/OlivierBlanvillain/SlickChair/blob/master/app/controllers/Submitting.scala#L70) :( – OlivierBlanvillain

ответ

1

Я считаю, что вам нужно явно передать список [Int] конструктору MyForm, т.е.

val existingMyForm = myForm.fill(MyForm(
    Topics.of(member).map(_.id).toList 
)) 

EDIT - Вот моя основная реализация, которая работала в Play 2.1.1 Scala:

case class MyForm(topics: List[Int]) 
case class Topic(id: Int) 
val myForm: Form[MyForm] = Form(
    mapping("topics" -> list(number))(MyForm.apply _)(MyForm.unapply _) 
) 

val topicList:List[Topic] = List(Topic(1), Topic(2), Topic(3)) 

def test = Action { implicit req => 
    val existingMyForm = myForm.fill(MyForm(
    topicList.map(_.id) 
)) 
    Ok(views.html.test(existingMyForm)) 
} 
+0

[Topics.of] (https : //github.com/SlickChair/SlickChair/blob/master/app/models/entities/Topics.scala#L38) возвращает список [Тема], а Тема имеет поле id: Int, поэтому этот .toList в списке [ Int] ничего не изменит. – OlivierBlanvillain

+0

Вы правы. См. Мое редактирование, единственное, что я могу придумать, это то, что Topics.of не возвращает список. Можно ли увидеть, как реализуется Thread.of? – josephpconley

+0

В моем предыдущем комментарии есть ссылка на Thread.of. – OlivierBlanvillain