【问题标题】:Scala Play Map FormsScala Play 地图表格
【发布时间】:2013-11-01 17:47:08
【问题描述】:

这个问题已经在这个网站上问过很多次了,但我还是想不出答案。我正在尝试将表单映射到我拥有的案例类,这是案例类:

  case class MapVitalSign(id:Long,name:String,
    lowerBoundComplicationId:Long, upperBoundComplicationId:Long,
    lowerBound:Double,upperBound:Double) extends VitalSign(  
    id,name,
    lowerBoundComplicationId,upperBoundComplicationId,
    lowerBound,upperBound)

这是我试图将其映射到的代码。

  val vitalSignForm: Form[MapVitalSign] = Form(
    mapping(
      "id" -> ignored(Long), 
      "name" -> text, 
      "lowerBoundComplicationId" -> number, 
      "upperBoundComplicationId" -> number,  
      "lowerBound" -> number, 
      "upperBound" -> number)
      ((id,name,lowerBoundComplicationId,
      upperBoundComplicationId,lowerBound,
      upperBound) => MapVitalSign(id,name,
      lowerBoundComplicationId.toLong,
      upperBoundComplicationId.toLong,lowerBound.toDouble,
      upperBound.toDouble),
      (v:MapVitalSign) => Some(v.id,v.name,v.lowerBoundComplicationId.toInt,v.upperBoundComplicationid.toInt, lowerBound.toInt,upperBound.toInt)    )   
  )

我的映射错误发生在哪里,据我所知,一切似乎都映射到了正确的类型,并且争论的数量是正确的。是否与最初忽略的“id”字段有关(因为我的 posgres db 没有生成一个)?

【问题讨论】:

  • 使用ignored时,需要提供一个实际值。例如ignored(0L),或者其他什么,因为稍后会填写。

标签: scala playframework


【解决方案1】:

如果您的表单和案例类具有相同的字段,您应该能够使用案例类的 apply 和 unapply 方法:

import play.api.data.format.Formats._

val vitalSignForm: Form[MapVitalSign] = Form(
  mapping(
    "id" -> of[Long],
    "name" -> text, 
    ...
  )(MapVitalSign.apply _)(MapVitalSign.unapply _)
)

【讨论】:

  • 如何在表单中指定一个值 Long 而不仅仅是一个通用的“数字”?
  • longNumber映射。
  • 更新了长映射。
【解决方案2】:

作为 ignored方法状态的文档,“当我们在绑定/解除绑定时忽略此参数时,我们必须提供默认值”,您应该为其提供默认值。所以用ignored(0L) 替换ignored(Long) 应该会有所帮助。

【讨论】:

    猜你喜欢
    • 2016-03-09
    • 1970-01-01
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    • 2019-10-20
    • 2020-07-06
    相关资源
    最近更新 更多