2015-01-27 10 views
1

Я пытаюсь сохранить значения формы в базу данных, и играть я получаю ошибку:Play Framework: несоответствие типа ошибки; найдено: Int требуется: 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() 
    } 
    } 

} 

Я принял помощь от книги по приготовлению scala для этих функций сохранения, но у меня возникла проблема, поскольку я новичок в игре scala, возможно, ошибка была незначительной, поэтому, пожалуйста, помогите мне, все, что я хочу, - это сохранить все входные значения в DB, который был введен в форме

ответ

2

Проблемы с вашей функцией контроллера register:

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.save возвращает Int, а функция управления ожидает Result, как Ok(..), Redirect(...) и т. Д. Вам нужно что-то сделать с результатом User.save, чтобы вернуть Result.

Было бы лучше, если бы вы использовали executeInsert() вместо executeUpdate() как executeInsert возвращает Option[Long] по умолчанию - которые помогут вам определить, если спасбросок был успешным.

.: например

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) возвращает целочисленное значение. Действия должны всегда возвращать результат, так что пишите

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

Спасибо, это помогло мне – swaheed

Смежные вопросы