3

这就是我得到的:

控制器

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,我想防止任何外部更改。

4

1 回答 1

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。

于 2013-07-13T12:54:40.780 回答