Scala的Play Framework文档显示了一个将表单隐式映射到案例类的示例:
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)和carId
(String)
val userForm = Form(
mapping(
"name" -> text,
"car" -> carRepository.findById(nonEmptyText) // concept I wish
)(User.apply)(User.unapply)
)
有没有办法在这个愿望的行中实例化一辆汽车,例如表格提供了一些carId
并确保carId
不是空的String
?
答案 0 :(得分: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)
)
答案 1 :(得分: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)
}
此答案提供了另一个Formatter
:Play 2 - Scala - Forms Validators and radio buttons
然后您可以像这样使用它:
val userForm = Form(
mapping(
"name" -> text,
"car" -> of[Car]
)(User.apply)(User.unapply)
)
答案 2 :(得分:2)
迟到了,但我刚刚发布了一个实用程序来帮助解决这个问题!使用您的类,您的代码将如下所示:
in10xml_uploaded_YYYYMMDD_HHMMSS format
您可以在github上找到将其包含在项目中的来源和说明:https://github.com/Iterable/iterable-play-utils