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