使用提升框架工作验证scala中表单中的字段

时间:2013-04-18 08:40:43

标签: forms validation scala lift

我正在使用Lift框架和Scala。我有一个表单来注册我的应用程序,我想验证其中的所有字段。我有一个代码片段,我可以访问我的表单值,还有一个验证类,我在其中编写了验证函数。以下代码是我到目前为止所尝试的。在我的代码段中:

if(validationClassObject.validateName(first_name)){
  if(validationClassObject.validateName(last_name)){
    if(validationClassObject.validateEmail(email)){
      if(validationClassObject.validateUserName(name)){

        // Adding values to the DB
        S.redirectTo("/")

      }
      else{
        S.notice("Invalid User Name")
      }               
    }
    else{
      S.notice("Invalid Mail Id")                 
    }
  }
  else{
    S.notice("Invalid Last name")
  }           
}
else{
  S.notice("Invalid First Name")
}

在我写的validationClass中,验证码如下:

//function for validating mail address
 def validateEmail(email: String): Boolean =
     """(\w+)@([\w\.]+)""".r.unapplySeq(email).isDefined
 //code for validating remaining fileds like above

这是有效的,但我知道这不是在Scala中编写此操作的最佳方法。我怎样才能以更具伸缩性的方式修改我的代码?我如何在这里使用案例类?

3 个答案:

答案 0 :(得分:1)

你可以这样做:

  def av[T,V](validationFunction: => Boolean, error: => T)(f: => V)={
    if(!validationFunction) error
     else f
  }
  def v[V](validationFunction: => Boolean, error: => String)(f: => V)=av(validationFunction,S.notice(error))(f)


  import validationCalssObject._

  v(validateName(last_name),"Invalid Last name"){v(validateName(name),"Invalid User Name"){...}}

av是一个抽象方法,TV作为error函数的结果类型,并继续函数fv是一个更具体的函数,它需要error的字符串并封装notice()调用。我们将f作为花括号v(validation, errormsg){/*todo when there is no problem*/}中的一部分。

答案 1 :(得分:1)

我无法在评论中进行格式化,因此我会发布一个新答案。

def badName() = if ("name" == "") Some("bad name") else None

def badEmail() = if ("email" == "") Some("bad email") else None

val verifications = List[() => Option[String]](badName, badEmail)

val failed = verifications.flatMap(_())
if (failed.nonEmpty) {
    // handle failed
} else {
    // your custom logic here
}

答案 2 :(得分:0)

if (badName) S.notice
else if (badEmail) S.notice
else if (badDay) S.notice
else { // everything OK...
    // return a JsCmd or what else do you wanted here
}

可以使用Option和flatMap编写替代解决方案,而不使用所有“if”-s硬编码。如果您对此感兴趣 - 请问..