3
 details.bindFromRequest.fold(
    errors => BadRequest(views.html.adminpages.aboutusimgsForm(errors)),

[NoSuchElementException: None.get]

从这个表格

@(details: Form[AboutImages])

<input type="hidden" name="id" value="@details.get.id">
<input type="text" name="name" value="@details.get.name">

我有一个aboutusimgs/edit/1从数据库(mysql)添加文本和隐藏表单输入的编辑表单。

但是当我不填写表格并且绑定的错误部分执行时:

errors => BadRequest(views.html.adminpages.aboutusimgsForm(errors)),

我得到了NoSuchElementException我是否为错误制作了另一个表单为什么我只能使用编辑表单?

谢谢

4

3 回答 3

1

这里的问题是,如果没有设置一个值,它将具有None作为值。None.get总是抛出 a NoSuchElementException,因为它显然没有元素。您可以Option通过多种方式处理 s,但如果您有默认设置,则可以简单地使用getOrElse. 例如:

// first map it to the id, then get the value or default if None
details.map(_.id).getOrElse("")

您还应该查看该类型的scala 文档Option,并阅读有关如何使用选项的几篇文章中的一两篇。

于 2013-03-04T09:45:51.307 回答
0

要使用Option's 结果,您永远不应该get直接使用方法。

为什么?因为它准确地导致了来自 Java 的潜在NullPointerException概念(因为通过 抛出 NoSuchElementException None)=> 阻止了您的编码方式的安全性。

要检索结果,特别是根据检索到的值做某事,更喜欢模式匹配或更短的fold方法:

/** Returns the result of applying $f to this $option's
   *  value if the $option is nonempty.  Otherwise, evaluates
   *  expression `ifEmpty`.
   *
   *  @note This is equivalent to `$option map f getOrElse ifEmpty`.
   *
   *  @param  ifEmpty the expression to evaluate if empty.
   *  @param  f       the function to apply if nonempty.
   */
  @inline final def fold[B](ifEmpty: => B)(f: A => B): B =
    if (isEmpty) ifEmpty else f(this.get)

getOrElse或者,如果您只想检索Option's 结果并在处理 a 时提供默认值,则可以选择使用方法None

  /** Returns the option's value if the option is nonempty, otherwise
   * return the result of evaluating `default`.
   *
   *  @param default  the default expression.
   */
  @inline final def getOrElse[B >: A](default: => B): B =
    if (isEmpty) default else this.get 
于 2013-03-04T11:17:29.577 回答
0

假设你有一个List[Option[String]]or Seq... 解决方案是使用flatMapwhich removes Noneso

List(Some("Message"),None).map{ _.get.split(" ") } //throws error

但是如果你使用平面图

List(Some("Message"),None).flatMap{ i => i }.map{ _.split(" ") } //Executes without errors
于 2013-03-06T06:43:23.093 回答