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常にをスローします。NoSuchElementExceptionはいくつかの方法で処理できOptionますが、デフォルトがある場合は、単にを使用できますgetOrElse。例えば:

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

また、タイプのscalaドキュメントを見て、Optionオプションの使用方法に関するいくつかの記事の1つまたは2つを読む必要があります。

于 2013-03-04T09:45:51.307 に答える
0

Optionの結果を操作するには、メソッドを直接使用しないでください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し、 を処理する場合はデフォルト値を指定することもできます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 に答える