2012-02-16 3 views
2

저는 Scala와 MongoDB를 배우고 있습니다. Scalatra와 Casbah를 간단한 웹 앱의 프레임 워크로 사용하고 있습니다.Scalatra와 Casbah를 사용한 CRUD 작업

이것은 간단한 메시지 게시판이며, Casbah에서 CRUD 작업을 배우려는 의도입니다. 문제는 내가 메시지를 나열 할 때 사이트의 MongoDB에서 레코드를 유일하게 참조 할 수있는 방법이 없다는 것을 알게되었습니다.

현재 코드는 아래와 같습니다.

내가 가지고있는 문제는 ObjectID를 문자열로 변환 할 수 없다는 것입니다. 그러나 각 행에 대한 고유 ID가 없으면 웹 페이지에서 삭제 기능을 제공 할 수 없습니다.

Casbah를 사용하여 이러한 것들을 처리하는 표준 방법이 있습니까? 필자가 보았던 모든 자습서는 웹 페이지에서 레코드에 고유하게 액세스하거나 무시한 스칼래트를 무시하고 스칼라 코드에서 레코드를 처리하는 데에만 집중했습니다.

indexController.scala

get("/msgs") 
{ 
    contentType = "text/html"; 
    var list = new ListBuffer[Message]() 

    for (i <- coll.find()) 
    { 
     var message = new Message(); 
     message.author = i.getOrElse("author", "???").toString(); 
     message.message = i.getOrElse("msg", "???").toString(); 
     message.id = i.getOrElse("_id", "???").asInstanceOf[String]; 

     list += message; 
    } 

    layoutTemplate("/Views/index.scaml",("list" -> list.toList)); 
} 

index.scaml

%body 
    %h2 
    Messages 
    %br 
     %ul 
      [email protected] val list: List[domain.Message] 
      - for (l:domain.Message <- list) 
       %li 
        From: #{l.author} 
        \- #{l.message} 
        %form{:method => "DELETE", :action => "msg/#{l.id}"} 
         %input{:type => "submit", :value => "Delete"} 

답변

3

당신이 캐스팅 할 수 있지만 이후 easilly 문자열로 렌더링 할 수 있습니다

i.getAs[ObjectId]("_id") map (_.toString) getOrElse "???" 

그리고 템플릿에 당신 할 수있다

#{l.id.toString} 
+0

l.id.toString 접근법에 대해 설명했습니다. 그런 다음 삭제 메소드에서 문자열을 구문 분석하여 게시물을 제거하면 큰 감사를드립니다. –

+0

이제 i.getAs [ObjectId] ("_ id"). toString이 작동하지 않는 이유를 알고 있다면? 확실히 i.getAs [ObjectId] ("_ id")는 ObjectId를 반환해야하고 ObjectId는 .toString 메서드를 가지고 있으므로 i.getAs [ObjectId] ("_ id")가 작동하지 않습니다. –

+0

Some 또는 None을 반환하기 때문에. 따라서'toString'은 문자열'Some (<당신의 id는 string>)''또는 문자열' "None"' –

관련 문제