这就是我得到的:
控制器
val form = Form(
mapping(
"id" -> optional(number),
"name" -> optional(nonEmptyText),
"supID" -> number,
"price" -> longNumber)(Coffee.apply)(Coffee.unapply) )
val extraForm = Form(
mapping(
"coffeeId" -> number,
"amountOfDrinkers" -> number
)(Extra.apply)(Extra.unapply) )
def showForm = Action { implicit request =>
Ok(views.html.show_form(form, extraForm)
}
//And then form validation & insertion
def save = Action { implicit request =>
form.bindFromRequest.fold(
// The second parameter for createForm would supposly pass the second form
// with or without errors
formWithErrors => BadRequest(html.coffees.createForm(formWithErrors, /*secondForm?*/ )),
entity => {
database withTransaction {
Coffees.insert(entity)
// So far we have worked & inserted the val form
// But how can I also work & inser the extraForm ?
}
})
}
1。我如何在同一表格(例如外键)中获得额外的输入,以便进行验证&插入另一张桌子?
2。 id是可选的,我在case类中将其定义为Option。是否有人可以修改Post&插入id(没有id输入),在模型中它被设置为PrimaryKey& AutoIncrease,我想防止任何外部改动。
答案 0 :(得分:1)
我对Play表单处理不是很熟悉,但是
关于1:
您可以使用(Coffee.apply)(Coffee.unapply)
之类的内容将字段分隔为不同的实体,而不是({ case (a,b,c,d) => (Coffee(a,b),OtherRow(c,d)) })({ case (Coffee(a,b),OtherRow(c,d)) => (a,b,c,d) })
。
后来Coffees.insert(entity._1); OtherTable.insert(entity._2)
关于2: 像POST这样的HTTP请求是用户输入,您无法信任。确保所有内容都不会出现异常。首先,确保不插入*投影,而是插入单独的一个,不包括id列。然后没人能插入id。 (Play-slick中的计算机数据库示例目前是一个不好的例子,因为它使用*来定义autoInc。)你可以在这里找到一个更新的(但也更抽象的)示例https://github.com/cvogt/play-slick/blob/93ecc12e60c7dcaf470e7886c50fd312ea5575fa/samples/computer-database/app/models/schema.scala
其次,您可能需要确保创建咖啡的表单不包含id字段。或者如果有一个id字段为你买了一些重要的东西,比如表单的可重用性,那么在插入的情况下验证它是否设置为None。