2016-12-15 23 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)) 
    ) 
)