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