2015-01-27 4 views
1

나는 데이터베이스에 양식 값을 저장하려고, 나는 오류가 점점 오전 재생 오전 :재생 프레임 워크 : 오류 유형 불일치; 발견 : 지능이 필요 : play.api.mvc.Result

: 여기

type mismatch; found :Int required: play.api.mvc.Result 

그리고 나의 코드 Application.scala

import play.api._ 
import play.api.mvc._ 
import play.api.data._ 
import play.api.data.Forms._ 
import views.html.defaultpages.badRequest 
import play.api.data.validation.Constraints._  
import models.User 
import models.UserData  

object Application extends Controller { 

    val RegisterForm = Form(
     mapping(  
     "fname" -> nonEmptyText(1, 20), 
     "lname" -> nonEmptyText(1, 20), 
     "email" -> email, 
     "userName" -> nonEmptyText(1, 20), 
     "password" -> nonEmptyText(1, 20), 
     "age" -> number, 
     "choice" -> text, 
     "gender" -> text 
    )(User.apply)(User.unapply) 
     .verifying("Ag should be greater then or equal to 18", model => model.age match { 
      case (age) => age >= 18 
     }) 
) 

    def index = Action { 
    Ok(views.html.index(RegisterForm)) 
    } 

    def register = Action { implicit request => 
     RegisterForm.bindFromRequest().fold(
      hasErrors => BadRequest(views.html.index(hasErrors)), 
      success => { 
       User.save(success) 
      } 
    ) 
    } 

} 

User.scala

import anorm._ 
import play.api.db.DB 
import anorm.SqlParser._ 
import play.api.Play.current 

case class User (
    fname: String, 
    lname: String, 
    email: String, 
    userName: String, 
    password: String, 
    age: Int, 
    choice: String, 
    gender: String 
) 

object User { 

    val userinfo = { 
    get[String]("fname") ~ 
    get[String]("lname") ~ 
    get[String]("email") ~ 
    get[String]("userName") ~ 
    get[String]("password") ~ 
    get[Int]("age") ~ 
    get[String]("choice") ~ 
    get[String]("gender") map { 
     case fname~lname~email~userName~password~age~choice~gender => 
      User(fname, lname, email, userName, password, age, choice, gender) 
     } 
    } 

    def save(ud: User) = { 
    DB.withConnection { implicit c => 
     SQL ("insert into userinfo(fname,lname,email,userName,password,age,choice,gender) values ({fname},{lname},{email},{userName},{password},{age},{choice},{gender})") 
     .on('fname -> ud.fname, 'lname ->ud.lname ,'email ->ud.email, 'userName->ud.userName , 'password->ud.password ,'age->ud.age, 'choice->ud.choice,'gender->ud.gender) 
     .executeUpdate() 
    } 
    } 

} 

이 저장 함수에 대한 스칼라 요리 책에서 도움을 받았지만 문제가 생겼습니다. 스칼라에 새로운 것이므로 어쩌면 실수가 미성년자 일 수 있습니다. 제발 저를 도우십시오. 모든 입력 값을 저장하는 것이 좋습니다. 형식으로 입력 된 DB

답변

2

을 결과를 반환, 그래서 작성해야 :

def register = Action { implicit request => 
    RegisterForm.bindFromRequest().fold(
     hasErrors => BadRequest(views.html.index(hasErrors)), 
     success => { 
      // You need to return a `Result` here.. 
      // Maybe redirect to login? 
      // Redirect("/login") 
      User.save(success) 
     } 
    ) 
} 

문제는 User.saveInt 반환하고, 컨트롤러 기능처럼 Result를 기대하고 있다는 것입니다 Ok(..), Redirect(...)Result을 반환하려면 User.save의 결과가 필요합니다.

당신이 executeInsert 반환 기본적으로 Option[Long]으로, executeUpdate() 대신 executeInsert()를 사용하는 경우 더 나은 것 - 저장이 성공 여부를 결정하는 데 도움이됩니다.

예컨대 :

def save(ud: User): Option[Long] = { 
    DB.withConnection {implicit c => 
     SQL("insert into userinfo(fname,lname,email,userName,password,age,choice,gender) values ({fname},{lname},{email},{userName},{password},{age},{choice},{gender})") 
      .on('fname -> ud.fname, 'lname ->ud.lname ,'email ->ud.email, 'userName->ud.userName , 'password->ud.password ,'age->ud.age, 'choice->ud.choice,'gender->ud.gender) 
      .executeInsert() 
    } 
} 

는 그런 다음 컨트롤러 함수 내에서 다음과 같이 사용 :

def register = Action { implicit request => 
    RegisterForm.bindFromRequest().fold(
     hasErrors => BadRequest(views.html.index(hasErrors)), 
     success => { 
      User.save(success) map { newId => 
       Redirect("/login") // or whatever you want this to do on success 
      } getOrElse { 
       InternalServerError("Something has gone terribly wrong...") 
      } 
     } 
    ) 
} 

당신은 응용 프로그램에서 뭔가 좀 더 의미있는 내 자리의 결과를 바꿀 수 있습니다.

+0

해결책과 설명에 감사드립니다. :) – swaheed

1

save (ud : User) 메서드는 정수 값을 반환합니다. 액션은 항상 문제는 컨트롤러 기능 register 함께

 success => { 
     val result = User.save(success) 
     Ok(result.toString) 
      } 
+0

덕분에 도움이되었습니다. – swaheed

관련 문제