【问题标题】:Updating only changed values into MongoDB from a Form Submission仅将更改的值从表单提交更新到 MongoDB
【发布时间】:2023-03-31 06:00:02
【问题描述】:

我一直在 ScalaPlay Framework (2.6) 中设置 REST API 和一直在尝试实现 (Scala) Form 的使用,但是在尝试找到仅更新表单提交时已更改的值的最佳实践时遇到了一些困难.我已经使用了这个article as a reference(以及其他),它使用 HTTP 请求 PATCHRoutes 文件类似:

   PATCH  /update/:collName    controllers.IndexC.update(collName: String, oId: Option[BSONObjectID])

但是,如果我在我的 (Play) 模板中为 form 操作 像这样路由到这个:

   @form(action = routes.IndexC.update(collName, oId), 'method -> "patch", ...)

然后它会出现无法找到文件的错误(尝试使用GET 要求)。我在某处读到如果浏览器不支持PATCH 作为HTTP 请求,就会发生这种情况。或者我完全误解了这一点 - 我们将其称为 我的知识差距的第 1 部分

另外(我的知识差距的第 2 部分)我很难理解如何只能检索来自表单提交的值(而不是所有输入框值)。所以假设我有一个非常简单的 Scala 模型和表单,如下所示:

   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)
     )

   }

有没有一种方法bindFromRequest 可以帮助检索那些已更改的输入值(来自 Mongo 数据库集合 以及最初输入表单的那些 - 使用 Countries.form.fill)。或者这也许在其他地方用更明智的方法做得更好?或者,第 1 部分 的解决方案可能使这无关紧要。非常感谢。

【问题讨论】:

  • 就 MVC 基础而言,这种表单绑定不应该是 DB 的奖励
  • @cchantep - 我不确定你的意思(可能是错字),但如果你想说:“这种表单绑定不应该意识到 DB”——那么它不是。但这当然不能解决问题。当然,任何见解总是受欢迎的。谢谢
  • @cchantep - 您是否有任何仅从 Scala 表单更新修改值的经验?我发现在 Stack Overflow 中获得任何答案越来越困难。也许有更好的论坛或地方来分享知识(特别是 Play Framework/Scala/Reactive Mongo)。欢迎提出建议

标签: mongodb scala playframework httprequest insert-update


【解决方案1】:

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

大声思考:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    相关资源
    最近更新 更多