4

我正在写一个小爱好应用程序。现在,在我的应用程序中,我希望人们拥有一个 userId(就像我的 niklassaers 在这里堆栈溢出一样),如果它已经被占用,我希望用户得到一个错误,以便他可以选择另一个。

下面是我的 Signup 对象,它在“mapping(”:“缺少对象表单中方法映射的参数;如果您想将其视为部分应用的函数,请使用 `_' 遵循此方法”

object Signup extends Controller {

  val userForm: Form[UserProfile] = Form(
    mapping(
      "userId" -> nonEmptyText,
      "passwordHash" -> nonEmptyText,
      "email" -> email
    ) verifying (
      "ThisIsATest", { case(userId, passwordHash, email) => true }
      // "UserID already taken", { DBService.exists(UserProfile.getClass().getName(), userId) }
      )(UserProfile.apply)(UserProfile.unapply))


  def index = Action {

    Ok(views.html.signup(userForm))
  }

  def register = Action { implicit request =>
    userForm.bindFromRequest.fold(
      errors => BadRequest(views.html.signup(errors)),
      user => Redirect(routes.Profile.index))
  }
}

如您所见,我已将查找服务替换为仅返回 true 的测试验证,以使示例不那么复杂。为了完整起见,这是我的 UserDetail 案例类:

case class UserProfile(
                   userId : String,
                   email: String,
                   passwordHash: String)

我是 Scala 新手和 Play 新手,所以如果这是一个非常琐碎的问题,我很抱歉。但:

  1. 自从我收到此错误以来,我做错了什么?

  2. 这是添加我自己的验证的正确方法吗?

  3. 后续问题:如果进展顺利,我会重定向,但我应该如何重定向到引用刚刚验证的表单的页面?

干杯

尼克

4

3 回答 3

5

终于解决了这个问题:验证不是映射之后的东西,而是约束条件下的东西。所以应该是

"userId" -> nonEmptyText.verifying( "UserID already taken", userId => DBService.exists(UserProfile.getClass().getName().replace("$", ""), userId) == false ),

我希望这可以帮助其他有同样问题的人:-)

于 2012-06-06T09:59:15.503 回答
4

有点晚了,但无论如何..

您可以对整个“表单支持对象”进行验证,而不是最终得到的单个字段。这类似于您在问题描述中发布的第一个代码。问题是您的验证块需要在应用/取消应用语句之后。

case class UserRegistration(username: String, password1: String, password2: String)

val loginForm = Form(
  mapping(
    "username" -> email,
    "password1" -> text,
    "password2" -> text
  )
  (UserRegistration.apply)(UserRegistration.unapply)
  verifying ("Passwords must match", f => f.password1 == f.password2)
)
于 2012-09-21T12:50:07.780 回答
0

甚至更晚,但无论如何...... :)

在整个“表单支持对象”上使用验证不会让您将错误添加到表单中的各个字段。如果您想这样做,请参阅Play!框架 2.0:使用其他字段验证表单中的字段

于 2013-11-09T23:02:26.473 回答