2013-09-17 6 views
1

는 그냥 재생이 프레임 워크로, 지난 주 스칼라 언어를 발견했습니다, 나는 조금 혼란 스러워요 ..여러 매개 변수를 사용하기 위해 스칼라 케이스를 사용하는 방법은 무엇입니까?

내가 이름이 튜토리얼과 암호를 사용하여 간단한 양식을 만들려고 :

def addUser() = Action { implicit request => 
    userForm.bindFromRequest.fold(
    errors => BadRequest, 
    { 
     case (username) => 
     User.create(User(NotAssigned, username, password)) 
     Redirect(routes.Application.index()) 
    } 
) 
} 

그것은 반환 : 찾을 수 없습니다 값 암호

http://www.jamesward.com/2012/02/21/play-framework-2-with-scala-anorm-json-coffeescript-jquery-heroku

하지만이 기능이 컨트롤러에서 작동하지 않습니다

케이스에 비밀번호를 입력해도 윙크가 안됩니다.

아이디어가 있으십니까?

Application.scala :

package controllers 

import play.api._ 
import play.api.mvc._ 
import play.api.data.Form 
import play.api.data.Forms.{single, nonEmptyText} 
import play.api.mvc.{Action, Controller} 
import anorm.NotAssigned 

import models.User 

object Application extends Controller { 

    val userForm = Form { 
    tuple(
     "username" -> nonEmptyText, 
     "password" -> nonEmptyText 
    ) 
    } 

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

    def addUser() = Action { implicit request => 
    userForm.bindFromRequest.fold(
     errors => BadRequest, 
     { 
     case (username, password) => 
      User.create(User(NotAssigned, username, password)) 
      Redirect(routes.Application.index()) 
     } 
    ) 
    } 
} 

User.scala :

package models 

import play.api.db._ 
import play.api.Play.current 

import anorm._ 
import anorm.SqlParser._ 

case class User(id: Pk[Long], username: String, password: String) 

object User { 

    val simple = { 
    get[Pk[Long]]("id") ~ 
    get[String]("username") ~ 
    get[String]("password") map { 
     case username~password => User(id, username) 
     case id~username => User(id, username) 
    } 
    } 

    def findAll(): Seq[User] = { 
    DB.withConnection { implicit connection => 
     SQL("SELECT * FROM user").as(User.simple *) 
    } 
    } 

    def create(user: User): Unit = { 
    DB.withConnection { implicit connection => 
     SQL("INSERT INTO user(username, password) VALUES ({username}, {password})").on(
     'username -> user.username , 
     'password -> user.password 
    ).executeUpdate() 
    } 
    } 
} 

답변

2

당신이 추출 할 모든 값, 즉이 포함되어야 바인딩하고 양식 :

import play.api.data.Form 
import play.api.data.Forms.{tuple,nonEmptyText} 

val userForm = Form(
    tuple(
    "username" -> nonEmptyText, 
    "password" -> nonEmptyText 
) 
) 

def addUser() = Action { implicit request => 
    userForm.bindFromRequest.fold(
    errors => BadRequest, 
    { 
     case (username, password) => { 
     User.create(User(NotAssigned, username, password)) 
     Redirect(routes.Application.index()) 
     } 
    } 
) 
} 

James의 예에서 양식에는 단 하나의 필드 만 포함됩니다.이 필드는 단일 값 (사용자 이름의 경우 사용자 이름)으로 추출됩니다. "튜플"폼 매핑을 사용하면 더 많은 가치를 얻을 수 있습니다.

+0

"찾을 수 없음 : 값 튜플"이라는 오류 메시지가 표시됩니다. – Azuken

+0

play.api.data.Forms.tuple 매핑을 참조합니다.이 예제에서는 가져 오기를 추가했습니다. – Mikesname

+0

그것은 나를 돌려 준다 : 타입 불일치; 찾았습니다 : play.api.data.Form [(String, String)] required : play.api.data.Form [String] – Azuken

0

fold() 함수의 두 번째 인수는 바인딩하려는 Form 클래스의 객체를 사용하는 또 다른 함수입니다. 귀하의 경우에는 "userForm"개체가됩니다.

def addUser() = Action { implicit request => 
    userForm.bindFromRequest.fold(
    errors => BadRequest, 
    okForm => { 
     // whatever you want 
    } 
) 
} 

양식의 형식을 알 수 없습니다. 더 말하기가 어렵습니다. 그러나, 나에 관해서는 여기에서 "사례"를 사용하는 것은 좋은 생각이 아닙니다.

+0

내 게시물을 편집했습니다. – Azuken

관련 문제