加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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),[....]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读