这真的很奇怪。我不知道出了什么问题,并试图解决这个问题至少一个小时。我为表单写了一个特别的验证器:
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()
时传入一个表单值。问题是,如果用户首次登录,我没有表单值。我应该传递什么呢?
感谢您的帮助!
答案 0 :(得分:2)
可能是因为在第一个和第二个if为假的情况下,你的函数将返回Unit。
尝试
if(!result.isEmpty && password.bcrypt hash= result(0).password) {
Some(UserData(email, password))
}
else {
None
}
查看它是否可以解决您的问题。