3

ScalaのPlayFrameworkドキュメントは、フォームをケースクラスに暗黙的にマッピングするサンプルを示しています。

case class User(name: String, age: Int)

val userForm = Form(
  mapping(
    "name" -> text,
    "age" -> number
  )(User.apply)(User.unapply)
)

この一意のサンプルでは、​​プリミティブ値のみが使用されていることがわかります。

この変更を行った場合はどうでしょうか。

case class Car(brandName: String)

case class User(name: String, car: Car)

さらに、フォームがUserの名前(String)と(String)をcarId返すと仮定しましょう。

val userForm = Form(
  mapping(
    "name" -> text,
    "car" -> carRepository.findById(nonEmptyText)  // concept I wish
  )(User.apply)(User.unapply)
)

carIdたとえばフォームによって提供されたものを使用して、この希望のラインで車をインスタンス化し、carIdが空でないことを確認する方法はありますStringか?

4

3 に答える 3

5

質問の最初の部分については、ドキュメントにネストされた値も示されています。

case class Car(brandName: String)
case class User(name: String, car: Car)

val userForm = Form(
  mapping(
    "name" -> text,
    "car" -> mapping(
        "brandName" -> text
    )(Car.apply)(Car.unapply)
  )(User.apply, User.unapply)
)
于 2013-02-25T19:30:10.367 に答える
5

を指定して、メソッドFormatterを使用できます。of[Car]

implicit val carFormat = new Formatter[Car] {
  def bind(key: String, data: Map[String, String]):Either[Seq[FormError], Car] = 
    data.get(key)
      // make sure the method returns an option of Car
      .flatMap(carRepository.findByBrandName _)
      .toRight(Seq(FormError(key, "error.carNotFound", Nil)))

  def unbind(key: String, value: Car) = Map(key -> value.brandName)
}

この答えは別のものを提供しますFormatterPlay2-Scala-フォームバリデーターとラジオボタン

その後、次のように使用できます。

val userForm = Form(
  mapping(
    "name" -> text,
    "car" -> of[Car]
  )(User.apply)(User.unapply)
)
于 2013-02-25T19:38:24.003 に答える
2

これに遅れて来ましたが、私はこれを助けるためのユーティリティをリリースしました!クラスを使用すると、コードは次のようになります。

case class Car(brandName: String)
object Car { implicit val mapping = CaseClassMapping.mapping[Car] }

case class User(name: String, car: Car)
object User { implicit val mapping = CaseClassMapping.mapping[User] }

val userForm = Form(implicitly[Mapping[User]])

ソースとそれをプロジェクトに含めるための手順は、githubで見つけることができます:https ://github.com/Iterable/iterable-play-utils

于 2016-10-11T19:33:58.283 に答える