2012-02-16 27 views
2

我正在學習Scala和MongoDB,並且正在使用Scalatra和Casbah作爲簡單Web應用程序的框架。使用Scalatra和Casbah的增刪改查操作

這是一個簡單的留言板,有意在Casbah學習CRUD操作。問題是我發現當我列出消息時,我無法在網站上唯一地引用MongoDB中的記錄。

我目前的代碼如下。

我遇到的問題是ObjectID不能被轉換爲字符串。但沒有每行的唯一標識,我無法從網頁提供刪除功能。

有沒有使用Casbah處理這些事情的標準方式?我見過的所有教程都忽略了從網頁中唯一訪問記錄,或者完全忽略了scalatra,並且只關注從scala代碼處理記錄。

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方法。然後在delete方法中解析字符串以刪除帖子,非常感謝。 – 2012-02-17 11:16:29

+0

現在,如果我只知道爲什麼i.getAs [ObjectId](「_ id」)。toString不起作用?當然,i.getAs [ObjectId](「_ id」)應該返回一個ObjectId,並且ObjectId有一個.toString方法,爲什麼i.getAs [ObjectId](「_ id」)。toString不起作用? – 2012-02-17 11:18:21

+0

因爲它返回一個或一個無。因此'toString'將返回字符串''Some(<你的id爲字符串>)「或字符串'」None「' – 2012-02-17 13:10:45