2015-06-01 34 views
1

幫助使用Scala形式的檢驗,驗證階形式,當窗體包含內殼類

這裏是表單數據的情況下類:

case class Data(
    firstName: String, 
    lastName: String, 
    email: String, 
    confirm_email: String, 
    password: String, 
    confirm_password: String) 
} 

和Scala形式:

val form = Form(
    mapping(
     "firstName" -> nonEmptyText, 
     "lastName" -> nonEmptyText, 
     "email" -> email, 
     "confirm_email" -> email, 
     "password" -> nonEmptyText(minLength = 8), 
     "confirm_password" -> nonEmptyText(minLength = 8))(Data.apply)(Data.unapply)) 

現在的問題是我們需要驗證「電子郵件」和「確認」電子郵件,但問題是我們需要創建tuplesmapping。那麼處理這些表單驗證情況的最佳方式是什麼?它只需使用元組即可輕鬆完成,而不是將其映射到任何案例類。

但是,如果我們需要使用mappingforms中的案例分類,可以做些什麼。

回答

3

首先,我擺脫了confirm_emailconfirm_password字段,因爲它們在Data模型中是多餘的。此操作後,它會是這樣的:

case class Data(
    firstName: String, 
    lastName: String, 
    email: String, 
    password: String) 

接下來,您形式的映射需要更新:

val form = Form[Data](
    mapping(
    "firstName" -> nonEmptyText, 
    "lastName" -> nonEmptyText, 
    "email" -> tuple(
     "email1" -> email, 
     "email2" -> email 
    ).verifying(Messages("form.error.emailNotEquals"), email => email._1 == email._2), 
    "password" -> tuple(
     "pass1" -> nonEmptyText(minLength = 8), 
     "pass2" -> nonEmptyText(minLength = 8) 
    ).verifying(Messages("form.error.passwordNotEquals"), password => password._1 == password._2) 
)((firstName, lastName, email, password) => Data(firstName, lastName, email._1, password._1)) 
    ((form: Data) => Some((form.firstName, form.lastName, (form.email, form.email), ("", "")))) 
) 

兩個改變是必需的:

  • 與驗證嵌套映射用於電子郵件和密碼字段。
  • 定製applyunapply方法實現爲了將具有六個字段的表格映射到具有四個字段的模型案例類。

請注意,自定義unapply方法不會爲密碼字段設置值,因爲在幾乎所有情況下它都是所需的行爲。

最後,必須更改您的視圖才能正確引用新的表單元組映射。例如,電子郵件的字段應如下所示:

@helper.inputText(dataForm("email.email1")) 
@helper.inputText(dataForm("email.email2")) 

不使用新元組映射的字段保持不變。

+0

感謝俺們丹尼爾,但我得到這個錯誤: '[錯誤]簽名:Some.apply [A](X:A):一些[A] [錯誤]給出的參數:form.firstName ,form.lastName,scala.Tuple2(form.email,form.email),scala.Tuple2(「」,「」) [error] after adaptation:Some((form.firstName,form.lastName,scala.Tuple2 (String,String,String),(String,String))) [error]((form:Data2)= >一些(form.firstName,form.lastName,(form.email,form.email),(「」,「」)))' – mane

+0

得到了問題:在表單的最後一行, '((form: Data())=> Some(....))'應該替換爲'((form:Data)=> Some((....)))''即額外的'()'。如果你可以在你的答案中做出必要的修改,我可以將你的ans標記爲正確的 – mane

+0

我已經做了必要的更新。我很高興你找到了:) –