仅从表单提交中将更改的值更新到MongoDB中

时间:2018-05-01 01:09:16

标签: mongodb scala playframework httprequest insert-update

我一直在 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部分 的解决方案可能会使这无关紧要。非常感谢。

1 个答案:

答案 0 :(得分:0)

Form类型的对象将始终为表单中的每个字段提供一些内容(如果它们是可选的,则为None)。页面上的表单标签(及其输入)确定http post请求中包含哪些对象。 bindFromRequest会将html输入字段名称与Form case类中的字段匹配(松散地说)。因此,没有自动方法只检测已更改的字段。有趣的用例虽然。

大声思考:

  1. 制作包含所有可选字段的Form对象的版本,并在bindFromRequest中检查哪些字段具有值。使用此信息构建仅包含这些字段的DB更新。在前端,仅填充更改的输入。您可能需要一个不属于表单的可见输入,然后是您的特殊可选输入,它是表单的一部分,因此也是POST的一部分。
  2. 构造一个新的案例类,其中包含前缀在检测到更改时设置的布尔hasChanged<Field1>hasChanged<Field2>类型字段(或其Seq字段。 Form对象将映射到这个新的case类,在bindFromRequest中你可以使用布尔值来智能地构造转到DB的唯一更改的字段。
  3. 首次加载表单时,使用控制器缓存案例类数据的未更改副本。在bindFromRequest中,将其与缓存值进行比较,并构建已更改字段的列表。
  4. 从使用表单和bindFromRequest切换到使用Ajax。在前端构造POST对象以仅包含更改的字段。在控制器中,使用JSON读取,其中所有案例类字段都是选项(ReadNullable)。然后,控制器可以根据JSON中存在的那些来确定填充哪一个。