2017-02-10 18 views
0

ReactiveMongo를 배우고 있습니다. 내 응용 프로그램에서는 MongoDB에서 데이터를 검색하여 HTML 양식으로 채 웁니다.PlayFramework, scala, reactivemongo 응용 프로그램의 MongoDB에서 HTML 양식을 채울 때 None.get을 얻습니다.

앞서 내 문제는 코드가 컴파일되지 않았다는 것입니다. 나는 그것을 고쳤지 만 지금은 데이터베이스에서 값 대신 None.get을 얻는다.

내가 MongoDB를에있는 데이터는 다음의 경우 클래스를

case class User2(
        name:String, 
        email:String, 
        age:Int, 
        gender:Boolean 
       ) 

를 다음에 매핑됩니다 반응성 몽고에서 필요로하는 독자입니다.

Question1 - 나는

object User2{ 
    implicit object UserReader extends BSONDocumentReader[User2] { 
     def read(doc: BSONDocument): User2= { 
     val name = doc.getAs[String]("name").get 
     val email = doc.getAs[String]("email").get 
     val age = doc.getAs[Int]("age").get 
     val gender = doc.getAs[Boolean]("gender").get 

     User2(name, email, age, gender) 
     } 
    } 
    } 

MongoDB를에서 None.get 대신 값을 받고 다음입니다 것은 내 컨트롤러 코드입니다.

Question2되는 HTML되는 다음 불필요한 수입

package controllers 

import anorm.{NotAssigned, Pk} 
import play.api.data.Form 
import play.api.data.Form._ 
import play.api.data.Forms 
import play.api.mvc.Controller 
import play.api.mvc._ 
import play.api.data.Forms._ 
import play.api.data.validation.Constraints._ 
import play.api.db.DB 
import models._ 
import scala.concurrent._ 
import ExecutionContext.Implicits.global 
import scala.util.Try 


import reactivemongo.api.MongoDriver 
import reactivemongo.bson._ 
import reactivemongo.api.MongoConnection 
import reactivemongo.api.collections.default.BSONCollection 



object Application_Test extends Controller { 
    val user2Form: Form[User2] = Form(
    mapping(
     "name" -> nonEmptyText, 
     "email" -> email, 
     "age" -> number, 
     "gender" -> boolean 
    )(User2.apply)(User2.unapply) 
) 

    def index = Action { 
    Async { 
     val driver = new MongoDriver() 
     val connection = driver.connection(List("localhost")) 
     val db = connection.db("website-users") 
     val collection = db.collection[BSONCollection]("user-table") 

     val query = BSONDocument("name" -> "Manu") 

     val result = collection.find(query).cursor[User2].collect[List]() 
/*  
      result.map { user => 
     //following code doesn't compile. I think result is List[models.User2]. I tried using user and user(0) but none of them compile 
      Ok(views.html.HTMLTest(user2Form.fill(user))) 
      } 
*/ 

// this version of code compiles 

result.map { user => user match { 
     case List() => Ok(views.html.HTMLTest(user2Form.fill(User2("a","[email protected]",1,true)))) 
     case h::v => Ok (views.html.HTMLTest (user2Form.fill (h))) 
     } 
     } 
    } 
    } 
} 

무시 - @form는 ("이름")는 값이 폼에서 값을 추출하는 올바른 방법.? API 문서에 표시된 바와 같이

@(form:Form[User2]) 

<!DOCTYPE html> 
<html lang="en" xmlns:font-variant="http://www.w3.org/1999/xhtml"> 
<head> 
    <meta charset="UTF-8"> 
    <meta http-equiv="X-UA-COMPATIBLE" content="IE=edge"> 
    <meta name="viewport" content="width=device-width,initial-scale=1"> 
    <title>HTML Test</title> 
    <link rel="stylesheet" type="text/css" href="@routes.Assets.at("stylesheets/bootstrap.min.css")"> 
    <!--link rel="stylesheet" href="stylesheets/bootstrap-theme.min.css"--> 
    <style type="text/css"> 

     html, body{height:100%; margin:0;padding:0} 

.center-form { 
    width:100%; 
    margin:auto; 
    position:relative; 
    top:50%; 
    transform: translateY(-50%) 
} 


</style> 

</head> 
<body> 

<div class="container center-form" > 

    <!-- for medium and large screens, 
    First row of Bootstrap grid contains logo. Total 3 columns (12/4). Logo in middle column--> 

    <div class="row" > 
     <!--empty column--> 
     <div class="col-md-4 col-lg-4" ></div> 

     <!--logo column--> 
     <div class="col-md-4 col-lg-4" > 
      <div> 
       <img src="@routes.Assets.at("images/Logo303x64.png")" alt="SalesWorkspace Logo" height="64" width="303"> 
      </div> 
     </div> 
     <!--empty column--> 
     <div class="col-md-4 col-lg-4"></div> 
     </div> 

    <!-- for medium and large screens, 
    Second row of Bootstrap grid contains the form for username and password. Total 3 columns (12/4). --> 
     <div class="row" > 
      <!--empty column--> 
      <div class="col-md-4 col-lg-4"></div> 

      <!--form--> 
      <div class="col-md-4 col-lg-4"> 

      <form> 
        <div class="form-group"> 
         <label for="first-name">First Name</label> 
         <input type="text" class="form-control" id="first-name" value="@form("name").value" required> 
        </div> 

        <div class="form-group"> 
         <label for="last-name">Last Name</label> 
         <input type="text" class="form-control" id="last-name" value="@form("name").value" required> 
        </div> 

        <div class="form-group"> 
         <label for="email">Email</label> 
         <input type="email" class="form-control" id="email" value="@form("email").value" required> 
        </div> 
        <div class="form-group"> 
         <label for="password">Password</label> 
         <input type="password" class="form-control" id="password" required> 
        </div> 
        <div class="form-group"> 
         <label for="confirm-password">Password</label> 
         <input type="password" class="form-control" id="confirm-password" required> 
        </div> 


        <button type="submit" class="btn btn-primary">Login</button> 
       </form> 
      </div> 
      <!--empty column--> 
      <div class="col-md-4 col-lg-4"></div> 
     </div> 
</div> 
<!--script src="@routes.Assets.at("javascripts/jquery-1.9.0.min")"></script--> 
<!--script src="@routes.Assets.at("javascripts/bootstrap.min.js")"></script--> 
</body> 
</html> 
+0

별도로 질문하십시오. – cchantep

답변

0

BSONDocument.getAs[T]Option[T] 등이 옵션으로 문서 필드에 사용될 수 반환합니다.

.get을 적용하면 분명히 코드 냄새가 난다.

필요한 필드를 얻으려면 .getAsTry을 사용하면 오류가 발생할 경우 세부 정보를 얻을 수 있습니다 (NoSuchElementException보다 None.get보다 유용함).

def read(doc: BSONDocument): User2= (for { 
    name <- doc.getAsTry[String]("name") 
    email <- doc.getAsTry[String]("email") 
    age <- doc.getAsTry[Int]("age") 
    gender <- doc.getAsTry[Boolean]("gender") 
    } yield User2(name, email, age, gender)).get 
+0

감사합니다. 당신의 팁이 도움이되었습니다. 문제는 부울 유형의 변환이었습니다. '[RuntimeException : reactivemongo.bson.BSONString은 reactivemongo.bson.BSONBoolean]으로 캐스팅 될 수 없습니다. '. 나는 아직이 새로운 문제를 해결하지 못했지만'User2 (name, email, age, true)에서 하드 코드 된 값 'true'를 사용한다. –

+0

내 코드의 또 다른 문제점은 MongoDB의 데이터 입력입니다. 나는 csv 파일을 사용했고 csv의 항목 'false'가 MongoDB에 저장하기 전에 문자열로 변환 된 것 같습니다 (부울로 저장하는 대신). CSV를 사용하는 대신 Robomongo를 사용하여 올바른 데이터 유형으로 항목을 만들었습니다. –