Play Framework 2模板表单None.get

时间:2013-10-16 16:04:48

标签: scala playframework-2.1

我是Play 2和Scala的新手,我在模板中得到了一个奇怪的异常:

Execution exception
-------------------

[NoSuchElementException: None.get]
In /home/nic/workspaces/scala-ide/scims/app/views/persons/detailTabs/personal.scala.html at line 4.

1. @(personId: Long, personDetailTabForm: Form[dto.PersonDetailTab])(implicit formOptions: dto.PersonFormOptions)
2. @implicitFieldConstructor = @{ helper.FieldConstructor(support.bs3HorizField.f) }
3. 
4. @persons.detail("personal", personDetailTabForm.get.firstName) {

personDetailTabForm是一个空表单对象,定义为:

  val personalDetailTabForm: Form[PersonDetailTab] = Form(
    mapping(
      "firstName"     -> text.verifying(nonEmpty),
      "middleName"    -> text,
      "lastName"      -> text.verifying(nonEmpty),
      "gender"        -> text,
      "dateOfBirth"   -> jodaDate("yyyy-MM-dd"),
      "ethnicity"     -> text,
      "maritalStatus" -> text,
      "password"      -> text
    )(PersonDetailTab.apply)(PersonDetailTab.unapply)
  )

关于这里有什么问题的任何想法?

我认为变量必须是一个选项以获得无?

干杯 NFV

1 个答案:

答案 0 :(得分:4)

您正在get上致电personDetailTabForm - 查看它的ScalaDoc:http://www.playframework.com/documentation/2.2.x/api/scala/index.html#play.api.data.Form - 似乎.get返回表单所包含的PersonDetailTab值 - 如同文档所说,'提交是成功的'。

您看到了None.get例外情况,因为当表单包含有效值时,play.api.data.Form[T]很可能只使用Option[T]get会返回Some[T] {1}}否则。

因此,在第4行,在scala模板中,您有类似

的内容
None

这是personDetailTabForm.get.firstName ,但只有当表单的基础String本身具有值时,您才能期望值。我不确定你想做什么,但是你正在处理一个情况,你想在模板中呈现的值可能不存在,无论出于何种原因。在这种情况下:

PersonDetailTab

这完全取决于您在@personDetailTabForm.value.map{ personDetailTab => @persons.detail("personal", personDetailTab.firstName) // { ... whatever else // anything else you want to render } getOrElse { // errors in the form; personDetailTabForm cannot yield a valid personDetailTab <h3> oops, what went wrong here? </h2> } 中想要做什么。 personal.scala.html是个好方法 处理某些Form[T]事物的输入和验证,但如果你只是显示它, 如果您有T(在您的情况下为T),只需将其传递给模板即可。如果您的PersonDetailTab可能存在,也可能不存在,则只需使用PersonDetailTab代替Option[PersonDetailTab]