2016-12-15 45 views
1

我正在使用Scala Forms。我已将表格数据中的键和值设置为元组,其具有字符串作为数据类型。Scala:在表单数据元组中映射选项[String]并访问它

val userForm = Form(
    tuple(
     "k1" -> optional(v1), 
     "k2" -> optional(v2), 
     "k3" -> optional(v3) 
    ) 
) 

和访问此表使用

val (k1, k2, k3) = userForm.bindFromRequest.get 

这是工作的罚款值

我需要的是。我要让K2K3键作为选项[字符串]类型和K1正常字符串类型。所以,当我把选项[字符串]k2,k3键。

val userForm = Form(
     tuple(
      "k1" -> optional(v1), 
      "k2" -> Some(optional(v2)), 
      "k3" -> Some(optional(v3)) 
     ) 
    ) 

它抛出错误 -

type mismatch; 
found : (String, Some[play.api.data.Mapping[Option[String]]]) 
required: (String, play.api.data.Mapping[?]) 

有什么建议?

+1

不可选(v1)是否像Play一样绑定到Option [String]? –

回答

2

Scala-Form为您提供了一种方法,使您可以通过使用optional字段类型获得Option值。

所以......在声明形式,

val userForm = Form(
    tuple(
    "k1" -> optional(text), 
    "k2" -> optional(text), 
    "k3" -> optional(text) 
) 
) 

然后,userForm已经声明了价值​​,k2k3Option[String]

所以有它的必要方式,​​声明的形式为正常text等为option(text)

val userForm = Form(
    tuple(
    "k1" -> text, 
    "k2" -> optional(text), 
    "k3" -> optional(text) 
) 
) 
1

表单映射也可以用定义可选值Forms.optional:

case class UserOptionalData(name: String, email: Option[String]) 
val userFormOptional = Form(
    mapping(
    "name" -> text, 
    "email" -> optional(email) 
)(UserOptionalData.apply)(UserOptionalData.unapply) 
) //example taken from play docs 

这将映射到输出中的选项[A],如果未找到表单值,则为None。

将​​从可选项更改为文本,使其成为必填项。制作​​文本

val userForm = Form(
    tuple(
     "k1" -> text, 
     "k2" -> Some(optional(text)), 
     "k3" -> Some(optional(text)) 
    ) 
)