2013-04-18 23 views
0

我正在使用Lift框架和Scala。我有一個表單來註冊我的應用程序,我想驗證其中的所有字段。我有一個片段,我可以訪問我的表單值,還有一個驗證類,我寫了我的驗證函數。下面的代碼是我到目前爲止嘗試過的。在我的摘錄:電梯框架工作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 

這是工作,但我知道這是不是在斯卡拉編碼此操作的最佳方式。我怎樣才能以更具擴展性的方式修改我的代碼?我如何在這裏使用案例課程?

回答

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"){...}} 

avTV一個抽象的方法,結果類型爲error功能和繼續功能fv是什麼期望字符串error和封裝notice()調用的更具體的功能。我們給f作爲花括號v(validation, errormsg){/*todo when there is no problem*/}的一部分。

+0

能否請你解釋一下爲什麼我們必須在這裏使用def'av [T,V]'和'v [V]'。並且我也無法理解'v()'函數調用部分,因爲我沒有將第二個參數'(f:=> V)'傳遞給它。你可以解釋一下嗎? thanx @axaluss。 – isc

+0

增加了一些解釋。 – axaluss

+0

謝謝@axaluss。它正在完美工作 – isc

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硬編碼。如果你對此感興趣 - 問..

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 
} 
+0

Thanx @Vasya Novikov – isc