scala – 玩!框架2.0:使用其他字段验证表单中的字段
发布时间:2020-12-16 09:32:17 所属栏目:安全 来源:网络整理
导读:在玩!框架,使用scala,说我有一个形式如下: import play.api.data._import play.api.data.Forms._import play.api.data.validation.Constraints._case class User(someStringField: String,someIntField: Int)val userForm = Form( mapping( "someStringF
在玩!框架,使用scala,说我有一个形式如下:
import play.api.data._ import play.api.data.Forms._ import play.api.data.validation.Constraints._ case class User(someStringField: String,someIntField: Int) val userForm = Form( mapping( "someStringField" -> text,"someIntField" -> number verifying(x => SomeMethodThatReceivesAnIntAndReturnsABoolean(x)) )(User.apply)(User.unapply) ) 其中SomeMethodThatReceivesAnIntAndReturnsABoolean是一种在int上执行一些逻辑来验证它的方法。 然而,我希望能够在验证someIntField时考虑someStringField的价值,是否有一种在播放框架中实现这一点的方法?我知道我可以做一些事情: val userForm = Form( mapping( "someStringField" -> text,"someIntField" -> number )(User.apply)(User.unapply) .verifying(x => SomeFunctionThatReceivesAnUserAndReturnsABoolean(x)) 然后我将把整个用户实例传递给验证函数。该方法的问题是所产生的错误将与整个表单相关联,而不是与someIntField字段相关联。 有没有办法得到这两件事情,使用另一个字段验证一个字段,并维护与我想要验证的特定字段相关联的错误,而不是整个表单? 解决方法
根据其他字段的值,对字段添加验证有相同的要求。我不知道这是如何在惯用的PLAY 2.2.1中完成的,但我想出了以下解决方案。在这种用法中,我将内置的“映射”降级为一个简单的类型转换器,并在“validateForm”方法中应用我的“高级字段”验证。映射:
val userForm = Form( mapping( "id" -> optional(longNumber),"surename" -> text,"forename" -> text,"username" -> text,"age" -> number )(User.apply)(User.unapply) ) private def validateForm(form:Form[User]) = { if(form("username").value.get == "tom" || form("age").value.get == "38") { form .withError("forename","tom - forename error") .withError("surename","tom - surename error") } else form } def update = Action { implicit request => userForm.bindFromRequest.fold({ formWithErrors => BadRequest(users.edit(validateForm(formWithErrors))) },{ user => val theForm = validateForm(userForm.fill(user)) if(theForm.hasErrors) { BadRequest(users.edit(theForm)) } else { Users.update(user) Redirect(routes.UsersController.index).flashing("notice" -> s"${user.forename} updated!") } }) } 即使它的作品我也急于寻找一个更习惯的版本… 编辑:在惯用的游戏中使用自定义的play.api.data.format.Formatter,更多在http://workwithplay.com/blog/2013/07/10/advanced-forms-techniques/ – 这允许您以编程方式向窗体添加错误。我的Formatter看起来像这样: val usernameFormatter = new Formatter[String] { override def bind(key: String,data: Map[String,String]): Either[Seq[FormError],String] = { // "data" lets you access all form data values val age = data.get("age").get val username = data.get("username").get if(age == "66") { Left(List(FormError("username","invalid"),FormError("forename","invalid"))) } else { Right(username) } } override def unbind(key: String,value: String): Map[String,String] = { Map(key -> value) } } } 注册在这样的形式映射: mapping( [...] "username" -> of(usernameFormatter),[....] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |