我是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)
)
关于这里有什么问题的任何想法?
我认为变量必须是一个选项以获得无?
干杯 NFV
答案 0 :(得分:4)
您正在get
上致电personDetailTabForm
- 查看它的ScalaDoc:http://www.playframework.com/documentation/2.2.x/api/scala/index.html#play.api.data.Form - 似乎.get
返回表单所包含的PersonDetailTab
值 - 如同文档所说,'提交是成功的'。
您看到了None.get
例外情况,因为当表单包含有效值时,play.api.data.Form[T]
很可能只使用Option[T]
而get
会返回Some[T]
{1}}否则。
因此,在第4行,在scala模板中,您有类似
的内容None
这是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.html
是个好方法
处理某些Form[T]
事物的输入和验证,但如果你只是显示它,
如果您有T
(在您的情况下为T
),只需将其传递给模板即可。如果您的PersonDetailTab
可能存在,也可能不存在,则只需使用PersonDetailTab
代替Option[PersonDetailTab]
。