表单错误匹配类型

时间:2013-03-04 08:33:49

标签: scala playframework-2.0

 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我是否因为错误而制作了另一个表单为什么我只能使用编辑表单?

由于

3 个答案:

答案 0 :(得分:1)

这里的问题是,如果未设置值,则将None作为值。 None.get始终会抛出NoSuchElementException,因为它显然没有元素。您可以通过多种方式处理Option,但如果您有默认值,则可以使用getOrElse。 E.g:

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

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

答案 1 :(得分:0)

要处理Option的结果,您绝不应该直接使用get方法。

为什么呢?因为它完全导致Java中潜在的 NullPointerException 概念(因为None抛出NoSuchElementException)=&gt;以你的编码方式防止安全。

要检索结果,特别是根据检索到的值做一些事情,更喜欢模式匹配或更好,更短的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的结果,并在处理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 

答案 2 :(得分:0)

假设您有List[Option[String]]Seq ...解决方案是使用flatMap删除None

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

但是如果你使用flatmap

List(Some("Message"),None).flatMap{ i => i }.map{ _.split(" ") } //Executes without errors