Обновление только измененных значений в MongoDB из представления формы - PullRequest
0 голосов
/ 01 мая 2018

Я настраивал REST API в Play Framework ( 2.6 ) в Scala и пытался реализовать использование ( Scala ) формы , но у меня возникают некоторые трудности при попытке найти лучший способ обновления только значений, которые изменились при отправке формы. Я использовал эту статью в качестве справочной (и других), и она использует HTTP-запрос PATCH, показанный как нечто похожее на это с Routes файл:

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

Однако, если я перейду к этому в моем ( Play ) шаблоне для действия формы , например:

   @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). Или, может быть, это лучше сделать в другом месте с более разумным подходом? Или, может быть, решение part 1 делает это неуместным. Большое спасибо.

1 Ответ

0 голосов
/ 10 мая 2018

Объект типа Form всегда будет иметь что-то для каждого поля в форме (или, конечно, None, если они являются необязательными). Тег формы на странице (и ее входные данные) определяют, какие объекты включены в запрос http post. bindFromRequest будет сопоставлять имена полей ввода html с полями в классе case (условно говоря). Таким образом, не существует автоматического способа обнаружения только измененных полей. Интересный вариант использования, хотя.

Мысли вслух:

  1. Создайте версию объекта Form со всеми необязательными полями и отметьте в bindFromRequest, какие из них имеют значения. Используйте эту информацию для создания обновления БД, содержащей только эти поля. На переднем конце заполняйте только те входы, которые были изменены. Вам, вероятно, понадобится видимый ввод, который не является частью формы, а затем ваш специальный необязательный ввод, который является частью формы и, следовательно, частью POST.
  2. Создайте новый класс дел с логическими полями типа hasChanged<Field1>, hasChanged<Field2> (или их Seq), которые задает интерфейс при обнаружении изменений. Объект Form будет отображаться в этот новый класс case, и в bindFromRequest вы можете использовать логические значения для интеллектуального конструирования только измененных полей, которые идут в DB.
  3. Когда форма загружается впервые, используйте контроллер для кэширования неизмененной копии данных класса дел. В bindFromRequest сравните это с кэшированным значением и создайте список измененных полей.
  4. Переключитесь с использования формы и bindFromRequest на использование Ajax. Во внешнем интерфейсе создайте объект POST, который будет содержать только измененные поля. В контроллере используйте чтение JSON, где все поля класса дел - это Options (ReadNullable). Затем контроллер может выяснить, какой из них заполнен, основываясь на том, какие из них присутствуют в JSON.
...