4

我是 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

4

1 回答 1

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]None

所以在你的第 4 行,在 scala 模板中,你有类似的东西

personDetailTabForm.get.firstName

那是 a 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.htmlForm[T]是处理某些T事物的输入和验证的好方法,但是如果您只是显示它,并且如果您有一个T(在您的情况下PersonDetailTab),只需将其按原样传递给模板。如果您PersonDetailTab可能存在也可能不存在,那么只需Option[PersonDetailTab]使用Form[PersonDetailTab].

于 2013-10-16T17:37:21.473 回答