自定义验证Play 2.0表单(scala)

时间:2012-06-05 20:47:11

标签: validation scala playframework playframework-2.0

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

在我的注册对象之后,它在“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新手和玩新手,所以如果这是一个非常微不足道的问题,我很抱歉。但是:

  1. 因为我收到此错误,我做错了什么?

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

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

  4. 干杯

    的Nik

3 个答案:

答案 0 :(得分:5)

最后解决了这个问题:验证不是映射后出现的东西,它是约束条件下的东西。所以它应该是

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

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

答案 1 :(得分:4)

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

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

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)
)

答案 2 :(得分:0)

即使以后,但无论如何......:)

使用对整个“表单支持对象”的验证不允许您向表单中的各个字段添加错误。如果您想这样做,请参阅Play! framework 2.0: Validate field in forms using other fields