4

私は 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)
  )

ここで何が問題なのかについてのアイデアはありますか?

None を取得するには、変数が Option でなければならないという印象を受けましたか?

乾杯NFV

4

1 に答える 1

4

あなたが呼び出し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]getSome[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.htmlForm[T]何かの入力と検証を処理するための良い方法Tですが、それを表示するだけで、T(あなたの場合はPersonDetailTab) がある場合は、それをそのままテンプレートに渡します。存在する場合PersonDetailTabも存在しない場合も、Option[PersonDetailTab]代わりに使用してForm[PersonDetailTab]ください。

于 2013-10-16T17:37:21.473 に答える