我刚开始使用Scala玩Play 2.1.1。通过一些教程/示例应用程序,我遇到了可用于创建表单的辅助方法,例如:
@(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))
}
我发现这很令人惊讶,因为我感觉通过Form对象的间接似乎“在错误的地方”。我期待的是这样的(伪):
@(user: User)
@helper.form(action = routes.Application.submit) {
@helper.inputText(() => user.userName)
@helper.inputPassword(() => user.password)
}
...这样就不必在控制器中定义Form对象;所有与表单相关的内容都将位于视图模板中。 将“这将被渲染成形式”的逻辑混合到控制器中似乎是对我的一点点违反SOC。
现在我想知道:这是Play中的事情,还是我错过了什么?是否有一种“更好”的方式来处理这个问题?
干杯,亚历克斯
答案 0 :(得分:1)
我认为控制器中的许多表单定义也会很烦人,尤其是应用程序将涉及多种形式。
但Play!Framework使开发人员能够更灵活地编写代码。您可以在scala模板助手中混合使用纯HTML,如下所示:
@helper.form(action = routes.Application.submit) {
<input type="text" name="username">
<input type="password" name="password">
....
}
在我看来,scala帮助器实际上有助于使用表单来更新之前创建的数据。因为它会将现有值绑定到默认输入值。此外,它还有助于显示由对象验证引起的错误。
如果表单不被认为是以前的值,比如登录表单,我认为使用纯HTML输入会被认为更好。