【问题标题】:Play Framework 2 template Form None.getPlay Framework 2 模板表单 None.get
【发布时间】:2013-10-16 16:04:48
【问题描述】:

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

【问题讨论】:

    标签: scala playframework-2.1


    【解决方案1】:

    您在 personDetailTabForm 上调用 get - 查找它是 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
    

    这是一个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] 而不是Form[PersonDetailTab]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-28
      • 2013-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-02
      相关资源
      最近更新 更多