2013-06-21 32 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

我想預先填寫我的數據庫中的數據。與其他類型的字段(numbertextoption()等),我能夠像這樣的東西來填充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,我仍然使用[hack](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 
)) 

編輯 - 這是我的基本實現,其工作了播放2.1.1斯卡拉:

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)返回一個List [Topic]和Topic有一個id:Int字段,所以這個.toList在一個List [ Int]不會改變任何東西 – OlivierBlanvillain

+0

你是對的請看我的編輯,我能想到的唯一的事情就是Topics.of不會返回一個列表,是否有可能看到Topics.of是如何實現的? – josephpconley

+0

我之前的評論有一個到Topics.of實現的鏈接 – OlivierBlanvillain