在选项和单元之间播放Scala表单类型不匹配

时间:2014-01-20 23:02:49

标签: scala playframework-2.0

这真的很奇怪。我不知道出了什么问题,并试图解决这个问题至少一个小时。我为表单写了一个特别的验证器:

def validate (email: String, password: String): Option[UserData] = DB.withSession { implicit rs: scala.slick.session.Session =>
    val result = Users.get(email)

    if (result.isEmpty) None
    else if(password.bcrypt hash= result(0).password) {
      Some(UserData(email, password))
    }
   }

完全披露,我使用了play-slick。神秘的password.bcrypt hash= ...也是我借用Hasher的加密函数:https://github.com/Nycto/Hasher。我在同一个控制器中定义了UserData

case class UserData(email: String, password: String)

这段代码对我来说似乎很好,但是来自play console的编译器说:

 /Users/.../Desktop/blog/play-slick-blog/app/controllers/Login.scala:25:
 type mismatch; found : Unit required:
 Option[controllers.Login.UserData] 
 else if(password.bcrypt hash= result(0).password) {
  ^ one error found

这不应该是一个错误的权利???发生了什么事?

我需要提出的另一个问题是:在我的登录页面视图中,第一行如下所示:@(form: Form[Login.UserData])。然后程序要求我在每次调用render()时传入一个表单值。问题是,如果用户首次登录,我没有表单值。我应该传递什么呢?

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

可能是因为在第一个和第二个if为假的情况下,你的函数将返回Unit。

尝试

if(!result.isEmpty && password.bcrypt hash= result(0).password) {
  Some(UserData(email, password))
}
else {
   None
}

查看它是否可以解决您的问题。