optional(number), "name" -> optional(-6ren">
gpt4 book ai didi

scala - 使用 Scala 的 Play & Slick 两种形式(验证和插入)

转载 作者:行者123 更新时间:2023-12-04 12:25:27 24 4
gpt4 key购买 nike

这是我得到的:

Controller

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

最佳答案

我对 Play 表单处理不是很熟悉但是

关于 1:你可以使用类似 ({ 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。

关于scala - 使用 Scala 的 Play & Slick 两种形式(验证和插入),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17624765/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com