我一直在 Scala 的 Play框架( 2.6 )中设置 REST API ,一直试图实现( Scala )表单的使用,但是在尝试找到仅更新表单提交时更改的值的最佳实践时遇到了一些困难。我已使用此article as a reference(以及其他人),并使用 HTTP请求 public static T[] selectAll<T>(this IList list, string property){
...
}
与路由文件类似的内容显示:
PATCH
但是,如果我在表单操作的我的( Play )模板中进行此操作,请执行以下操作:
PATCH /update/:collName controllers.IndexC.update(collName: String, oId: Option[BSONObjectID])
然后它会出现错误,无法找到该文件(尝试使用 @form(action = routes.IndexC.update(collName, oId), 'method -> "patch", ...)
请求)。我已经在某处看到,如果浏览器不支持GET
作为 HTTP请求,就会发生这种情况。或许我完全误解了这一点 - 我们称之为 我知识差距的第一部分 。
此外( 我的知识差距的第2部分 )我很难理解如何只检索表单提交中的值(而不是所有输入框值) )。所以假设我有一个非常简单的Scala模型&amp;表格看起来像这样:
PATCH
有 case class Countries(countryName: String, countryCode: String, currencyCode: String)
object Countries {
val form = Form(
mapping(
"countryName" -> nonEmptyText,
"countryCode" -> nonEmptyText,
"currencyCode" -> nonEmptyText
)(Countries.apply)(Countries.unapply)
)
}
方法可以帮助检索那些已经更改的输入值(来自 Mongo数据库集合以及最初输入到表单中的那些 - 使用{{1 }})。或者这可能更好地在其他地方以更明智的方式完成?或者 第1部分 的解决方案可能会使这无关紧要。非常感谢。
答案 0 :(得分:0)
Form
类型的对象将始终为表单中的每个字段提供一些内容(如果它们是可选的,则为None
)。页面上的表单标签(及其输入)确定http post请求中包含哪些对象。 bindFromRequest
会将html输入字段名称与Form case类中的字段匹配(松散地说)。因此,没有自动方法只检测已更改的字段。有趣的用例虽然。
大声思考:
bindFromRequest
中检查哪些字段具有值。使用此信息构建仅包含这些字段的DB更新。在前端,仅填充更改的输入。您可能需要一个不属于表单的可见输入,然后是您的特殊可选输入,它是表单的一部分,因此也是POST的一部分。hasChanged<Field1>
,hasChanged<Field2>
类型字段(或其Seq
字段。 Form对象将映射到这个新的case类,在bindFromRequest
中你可以使用布尔值来智能地构造转到DB的唯一更改的字段。 bindFromRequest
中,将其与缓存值进行比较,并构建已更改字段的列表。bindFromRequest
切换到使用Ajax。在前端构造POST对象以仅包含更改的字段。在控制器中,使用JSON读取,其中所有案例类字段都是选项(ReadNullable)。然后,控制器可以根据JSON中存在的那些来确定填充哪一个。