2013-10-16 183 views
4

进出口新的播放2和Scala,并即时得到我的模板,一个奇怪的例外:播放框架2模板表单None.get

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

回答

4

您在personDetailTabForm呼吁get - 查找其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]当形式持有有效的价值和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.html中做什么。 Form[T]是一个很好的方法 来处理一些T事件的输入和验证,但如果你只是显示它, ,如果你有一个T(在你的案例PersonDetailTab)只是将它传递给模板。如果您的PersonDetailTab可能存在也可能不存在,那么只需使用Option[PersonDetailTab]而不是Form[PersonDetailTab]

+0

很好的答案,谢谢! – nfvindaloo