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

Validation Play 2.0表单的自定义验证(scala),validation,scala,playframework,playframework-2.0,Validation,Scala,Playframework,Playframework 2.0,我正在写一个小的业余应用程序。现在,在我的应用程序中,我希望人们有一个用户ID(就像我的是stack overflow上的Niklasaers),如果已经有了,我希望用户得到一个错误,这样他就可以选择另一个 下面是我的Signup对象,它在“mapping”(:“缺少对象形式中方法映射的参数”行给出了一个错误;如果要将此方法视为一个部分应用的函数,请在该方法后面加上“\” 正如您所看到的,我已经用一个简单返回true的测试验证替换了我的查找服务,以降低示例的复杂性。为了完整性,这是我的UserD

我正在写一个小的业余应用程序。现在,在我的应用程序中,我希望人们有一个用户ID(就像我的是stack overflow上的Niklasaers),如果已经有了,我希望用户得到一个错误,这样他就可以选择另一个

下面是我的Signup对象,它在“mapping”(:“缺少对象形式中方法映射的参数”行给出了一个错误;如果要将此方法视为一个部分应用的函数,请在该方法后面加上“\”

正如您所看到的,我已经用一个简单返回true的测试验证替换了我的查找服务,以降低示例的复杂性。为了完整性,这是我的UserDetail案例类:

case class UserProfile(
                   userId : String,
                   email: String,
                   passwordHash: String)
我是一名Scala新手,也是一名游戏新手,如果这是一个非常琐碎的问题,我很抱歉。但是:

  • 自从我犯了这个错误,我做错了什么

  • 这是添加我自己的验证的正确方法吗

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

  • 干杯


    Nik终于解决了这个问题:验证不是映射之后的事情,而是约束之后的事情。所以它应该是

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

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

    有点晚了,但无论如何

    您可以对整个“表单备份对象”进行验证,而不是像您最后使用的那样只对单个字段进行验证。这类似于您在问题描述中发布的第一个代码。问题是验证块需要在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)
    )
    

    甚至后来,但无论如何…:)


    在整个“表单支持对象”上使用验证不允许向表单中的各个字段添加错误。如果您想这样做,请参见

    清除案例类定义中的VAL,案例类道具是默认不变的谢谢您的评论,我现在已经删除了VAL,但它不会改变任何东西,对吗?我仍然得到相同的编译错误事实上,我相信您可以在表单本身上进行全局验证。我自己还没有尝试过,但已经看到了您尝试的“跟踪”验证方式。感谢此解决方案,它起到了作用,只是我不得不将条件更改为getOrElse(None)=None我不知道自您回答此问题以来发生了什么变化,但它不再起作用,我们得到了
    匿名函数的参数类型必须是完全已知的
    我刚刚使用最新的播放版本(2.3.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)
    )