2013-02-18 52 views
0

我是新來的scala和類型安全的語言,所以我可以忽略一些基本的東西。這說這是我的問題。玩框架表單提交沒有通過驗證

目標我想提交一個只有一個文本輸入的表單,並且不會鏡像我的案例類。它最終將會類型:字符串

問題不能進入成功從折

我對前端的形式,我選擇在HTML,而不是劇中的寫形式傭工(願意改變,如果這是問題)

<form method="POST" action="@routes.Application.shorten()"> 
    <input id="urlLong" name="urlLong" type="text" placeholder="http://www.google.com/" class="span4"/> 
    <div class="form-actions"> 
    <button type="reset" class="btn">Reset</button> 
    <button type="submit" class="btn btn-primary pull-right"><span class="icon-random"></span> Shrtn It!</button> 
    </div> 
</form> 

時處理後的動作控制器看起來是這樣的:

import ... 

object Application extends Controller { 

    val newUrlForm = Form(
    "urlLong" -> text 
) 

    def shorten = Action { implicit request => 
    val urlLong = newUrlForm.bindFromRequest.get 

    newUrlForm.fold(
     hasErrors = { form => 
     val message = "Somethings gone terribly wrong" 
     Redirect(routes.Application.dash()).flashing("error" -> message) 
    }, 

    success = { form => 
     val message = "Woot it was successfully added!" 
     Redirect(routes.Application.dash()).flashing("success" -> message) 
    } 
    } 
    ... 
} 

我試圖關注/修改Play for Scala書中的教程,但它們將它們的表單與案例類匹配,並且Play的教程也與我的用例有點相似。除了你的答案,如果你可以包括你如何計算出來,這將是非常有用的,所以我可以更好地解決自己的問題。

此外,如果它的事項我使用的IntelliJ IDEA作爲我的IDE

回答

1

你需要調用form.bindFromRequest的摺疊方法。從documentation>處理綁定失敗

loginForm.bindFromRequest.fold(
    formWithErrors => // binding failure, you retrieve the form containing errors, 
    value => // binding success, you get the actual value 
) 

你也可以使用單一的映射構建一個單場

Form(
    single(
    "email" -> email 
) 
) 
+0

是映射只是一種轉換形式的名稱,然後的方式,還是他們服務其他一些(必要的)目的? – AKnox 2013-02-18 20:23:00

+0

yes映射是一種將html表單映射到您自己的域對象的簡單方法。在這種情況下,它是一個單一的參數,所以它沒有太大的幫助,事實上,你應該能夠直接綁定,如[這個答案](http://stackoverflow.com/a/9657824/152601)所示。但是,對於更復雜的場景,它確實非常方便 – mericano1 2013-02-18 22:06:19

0

我最終什麼了:

def shorten = Action { implicit request => 
    newUrlForm.bindFromRequest.fold(
    hasErrors = { form => 
     val message = "Somethings gone terribly wrong" 
     Redirect(routes.Application.dash()).flashing("error" -> message) 
    }, 

    success = { urlLong => 
     val message = "Woot it was successfully added!" 
     Redirect(routes.Application.dash()).flashing("success" -> message) 
    } 
) 
} 

不知道我真的明白我做錯了什麼,但是這個基於mericano1的答案的代碼最終也工作得很好。看起來好像以前我從表單中獲取urlLong val,然後摺疊表單,直接將表單摺疊,並在過程中提取urlLong的val。

此外,我不確定爲什麼fold的參數記錄不同。

+0

我認爲你所缺少的是'newUrlForm.bindFromRequest'對'newUrlForm'沒有任何副作用,它只是返回一個新的Form對象,其中綁定了來自請求的值。所以,如果你在newUrlForm而不是'newUrlForm.bindFromRequest'的值上不存在,那麼錯誤(你沒有在你的表單中標記urlLong文本是可選的) – mericano1 2013-02-18 22:13:02