代码之家  ›  专栏  ›  技术社区  ›  nfvindaloo

Play Framework 2模板表单None.get

  •  4
  • nfvindaloo  · 技术社区  · 11 年前

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

    有什么问题吗?

    我的印象是,一个变量必须是一个选项才能得到一个无?

    干杯 新冠病毒

    1 回复  |  直到 11 年前
        1
  •  4
  •   Faiz    11 年前

    你在打电话 get 在…上 personDetailTabForm -查找它的ScalaDoc: http://www.playframework.com/documentation/2.2.x/api/scala/index.html#play.api.data.Form -看起来 .get 返回 PersonDetailTab 表单包含的值-IF,正如文档所说,' 提交成功 '.

    你看到了 None.get 例外,因为很可能 play.api.data.Form[T] 简单地使用 Option[T] 收到 退货 Some[T] 当表单包含有效值并且 None 否则

    因此,在您的第4行,在scala模板中,您有如下内容

    personDetailTabForm.get.firstName
    

    这是一个 String ,但只有当窗体的基础 个人详细信息选项卡 本身就有价值。我不确定你想做什么,但你正在处理的情况是,无论出于什么原因,你想在模板中呈现的值可能不存在。在这种情况下:

    @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 (就你而言 个人详细信息选项卡 )只需将其原样传递给模板即可。如果 个人详细信息选项卡 可能存在也可能不存在,那么就使用 Option[PersonDetailTab] 相反 Form[PersonDetailTab] .