2013-10-16 92 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