2013-05-05 27 views
1

我有用戶映射如下(還有其他一些太)在Scala Play中用戶名上的不同模型驗證! 2形式的映射在創建和更新

val userMapping: Mapping[User] = mapping(
    "id" -> ignored(NotAssigned: Pk[Long]), 
    "title" -> nonEmptyText, 
    "name" -> nonEmptyText, 
    "userName" -> nonEmptyText, 
    "skype" -> nonEmptyText, 
    "emailId" -> ignored("": String), 
    "secondaryEmailId" -> ignored("": String), 
    "password" -> ignored("": String), 
    "position" -> optional(text), 
    "active" -> boolean, 
    "subscribeEmail" -> boolean, 
    "creationDate" -> optional(date("yyyy-MM-dd")), 
    "lastUpdatedDate" -> optional(date("yyyy-MM-dd")) 
)(User.apply)(User.unapply) 

的問題是,如果我的用戶名爲應用驗證作爲

"userName" -> nonEmptyText.verifying("User name is already taken", user => !User.findUserByUserName(user.userName).isDefined) 

這工作完全正常在創建用戶時,但在編輯窗體上,此驗證會中斷。 我想在創建和更新時使用相同的映射。

目前我已經將它從表單字段移動到表單級別,但事情是直到所有表單級別的錯誤,這種驗證永遠不會達到和顯示。

我的完整表格映射如下(與公司名稱相同的問題)。

val registerForm:Form[(User,Company)] = Form(
    mapping(
     "user" -> userMapping.verifying("User name is already taken", user => !User.findUserByUserName(user.userName).isDefined), 
     "password" -> passwordMapping, 
     "company" -> companyMapping.verifying("Company name is already registered", company => !Company.findCompanyByCompanyName(company.name).isDefined), 
     "emailPair" -> emailPairMapping 
    ){(user,passwords,company,emailPair) => (user.copy(password = passwords._1,emailId = emailPair._1,secondaryEmailId = emailPair._2,active = true),company)} //binding apply 
    {userCompanyTuple => Some(userCompanyTuple._1, ("",""),userCompanyTuple._2,(userCompanyTuple._1.emailId,userCompanyTuple._1.secondaryEmailId))} //un binding un apply 

) 

對於我有映射,(驗證仍然適用)編輯的情況下

val registerFormEdit:Form[(User,Company)] = Form(
    mapping(
     "user" -> userMapping, 
     "company" -> companyMapping, 
     "emailPair" -> emailPairMapping 
    ){(user,company,emailPair) => (user.copy(emailId = emailPair._1,secondaryEmailId = emailPair._2,active = true),company)} //binding apply 
    {userCompanyTuple => Some(userCompanyTuple._1,userCompanyTuple._2,(userCompanyTuple._1.emailId,userCompanyTuple._1.secondaryEmailId))} //un binding un apply 

) 

我看到的是如何獲得的id保持在編輯審定 「ID」的另一個挑戰被忽略。我需要在更新操作 方法中處理編輯案例嗎?

如果我必須在更新操作方法中執行此操作,示例代碼片段 會很棒,因爲我也很困惑如何在 操作方法中添加錯誤消息。

如果有人提供瞭如何實現這一點,那將會非常棒。

我使用Scala玩遊戲! 2.

謝謝。

回答

3

用於驗證的userNamecompany的獨特性,我相信問題是,在編輯User,驗證功能查找用戶名/公司在數據庫,因爲它是你事先插入的記錄。因此,您需要檢查用戶名/公司是否存在,以及它是否存在,請檢查該行的ID是否爲用戶的ID。如果它們相同,則返回true,因爲它只能找到您當前正在更新的記錄。

隨着User的ID,最好在Action中處理這個問題,而不是由於安全問題造成的表單綁定。 例如,如果在表單中設置並提交了標識,那麼很容易讓某人將標識輸入的值更改爲另一用戶的標識以更改其詳細信息。這類似於GitHub上是怎麼泄露去年http://www.infoq.com/news/2012/03/GitHub-Compromised

在一個粗略的代碼片段來看,沿着線的東西:

def update(userId: Long) = Action { implicit request => 
    val user = User.find(userId) 
    // Some type of authorization 
    if(!authorize(getCurrentUser(), user) { 
    BadRequest("access denied") 
    } else { 
    UserFormWithMappings.bindFromRequest().fold(
     formWithErrors => Ok("form errors"), 
     updatedUser => { 
     updatedUser.id = userId 
     User.update(updatedUser) // insert into db 
     Ok("User changes saved") 
     } 
    ) 
    } 
} 
+0

感謝我最後的答案做在行動方法,與授權檢查類似於你所放的,謝謝你的git集線器黑客連接,不知道,偉大的提示:)並花時間回答一個月的問題。 – 2013-07-03 07:47:42

+0

這個'authorize()'函數是什麼樣的? – KJ50 2015-03-06 06:00:50

相關問題