Scala Play Framework 2.6 - определяет маршруты, использующие пользовательские объекты - PullRequest
0 голосов
/ 20 октября 2018

В пакете models У меня есть следующий класс дел:

case class Property (id: Option[Long],
                 address: String,
                 postCode: Int,
                 latitude: Double,
                 longitude: Double,
                 surface: Option[Int],
                 bedRoomCount: Option[Int])

object Property {
    implicit val propertyFormat = Json.format[Property]
}

Я пытаюсь настроить маршрут, передающий объект Property:

POST    /update-property            controllers.PropertyController.update(property: models.Property)

Мой контроллер определяетдействие:

def update(property: Property) = Action.async { implicit request =>
 ...bla bla bla...
}

Я получил следующую ошибку компиляции:

[error] conf/routes:8:1: No QueryString binder found for type models.Property. Try to implement an implicit QueryStringBindable for this type.
[error] POST    /update-property            controllers.PropertyController.update(property: models.Property)
[error] conf/routes:8:1: not enough arguments for method implicitly: (implicit e: play.api.mvc.QueryStringBindable[models.Property])play.api.mvc.QueryStringBindable[models.Property].
[error] Unspecified value parameter e.

Чего мне не хватает?Можно ли заполнить форму данными property?

1 Ответ

0 голосов
/ 21 октября 2018

Как говорит ошибка компиляции, вам нужно реализовать implicit QueryStringBindable.Примерно так:

object Binders {

  //return the error message on the left should the parsing fail
  private def propertyFromString(s: String): Either[String, Property] = ???

  private def propertyToString(property: Property): String = ???

  implicit def queryStringBindable(implicit stringBinder: QueryStringBindable[String]): QueryStringBindable[Property] = new QueryStringBindable[Property] {
    override def bind(key: String, params: Map[String, Seq[String]]): Option[Either[String, Property]] = {
      for {
        eitherPropString <- stringBinder.bind("property", params)
      } yield {
        eitherPropString match {
          case Right(propString) => propertyFromString(propString)
          case _ => Left("Unable to bind property")
        }
      }
    }
    override def unbind(key: String, property: Property): String = {
      stringBinder.unbind("property", propertyToString(property))
    }
  }

}

Для ??? вам потребуется написать код для кодирования / декодирования Property в / из String.Затем в свой файл build.sbt добавьте

routesImport += "path.to.Binders._"

, чтобы ваш файл routes имел доступ к вашему объекту Binders.Документация здесь .Если вместо этого вы хотите передать поля Property в качестве отдельных параметров запроса, см. Пример AgeRange в документации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...