3

我剛開始使用Scala玩Play 2.1.1。通過一些教程/示例應用程序走,我穿過輔助方法,可以用來創建表單,例如:玩!框架表單/ HTML助手:分離問題?

@(myForm: Form[User]) 

@helper.form(action = routes.Application.submit) { 

    @helper.inputText(myForm("username")) 

    @helper.inputPassword(myForm("password")) 

} 

來到我仍然是一個的n00b這一點。但據我瞭解,這基本上需要一個表單對象控制器,其「包裝」的模式(簡體)中被定義爲:

val loginForm = Form(
    tuple(
     "email" -> text, 
     "password" -> text 
    )) 
) 

    def login = Action { implicit request => 
    Ok(html.login(loginForm)) 
    } 

我發現這suprising,因爲我得到的感覺是間接通過Form對象似乎「在錯誤的地方」。我期待的是這樣的(僞):

@(user: User) 

@helper.form(action = routes.Application.submit) { 

    @helper.inputText(() => user.userName) 
    @helper.inputPassword(() => user.password) 
} 

...所以一個人不必在控制器中定義Form對象;所有與表單相關的東西都將位於視圖模板中。 將「這種將被呈現的表單」邏輯混合到控制器中似乎對我來說是一個輕微的SOC侵犯。

現在我想知道:這是玩遊戲的方式,還是我錯過了什麼?有沒有更好的方法來處理這個問題?

乾杯,亞歷克斯

回答

1

我認爲這將是太煩人在控制器許多形式的定義,尤其是應用程序將牽涉到很多形式。

但Play!Framework使開發人員能夠更靈活地編寫代碼。你可以像這樣混合斯卡拉模板幫手內純HTML:

@helper.form(action = routes.Application.submit) { 
    <input type="text" name="username"> 
    <input type="password" name="password"> 

    .... 
} 

在我看來,斯卡拉傭工形式實際上有助於更新之前已經創建的數據。因爲它會將現有值綁定到默認輸入值。此外,它還有助於顯示由對象驗證引起的錯誤。

如果表單不被視爲之前的值,如登錄表單,我認爲使用純HTML輸入將被認爲更好。

+0

我最終按照你的建議,並使用「普通」的HTML來創建我的表單。然而,在編碼過程中,我得到的印象是關鍵問題並不是真正的形式助手,而是如何完成對路線的反向查找。使用POST參數時可能會很棘手......我想在使用「form-in-controller」方法(它使POST參數解析更容易,但在控制器中引入一些「異味」)和手動解析POST參數從請求(這是更多的「樣板」,但不需要表單的東西)。 – 2013-04-10 14:12:02

+0

@ alexander.biskop爲了跟進,我不同意控制器中的「表單」增加了氣味。表格不僅僅是視圖的一部分。首先,來自該表單的數據被重新發布,並且_somehow_控制器必須知道它如何與其接收的數據進行交互。其次,表單可以與驗證邏輯和與視圖相關的其他事物相結合。這裏的關鍵在於你在控制器中訪問的「表單」根本與表示無關(因此,這些問題實際上很好地分離了) – 2013-07-18 01:32:16