Платформа Play: несоответствие типа ошибки; найдено: Требуется 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 для этих функций сохранения, но у меня возникла проблема, так как я новичок в play scala, возможно, ошибка была незначительной, поэтому, пожалуйста, помогите мне, все, что я хочу, это сохранить все входные значения в БД, которая была введена в виде


person swaheed    schedule 27.01.2015    source источник


Ответы (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], что поможет вам определить, было ли сохранение успешным.

e.g.:

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...")
           }
       }
    )
}

Вы можете заменить мои результаты-заполнители чем-то более значимым в своем приложении.

person Michael Zajac    schedule 27.01.2015

Метод save (ud: User) возвращает целочисленное значение. Действие всегда должно возвращать результат, поэтому напишите

     success => {  
       val result = User.save(success)
         Ok(result.toString)
           }
person S.Karthik    schedule 27.01.2015