使用Scalatra和Casbah的CRUD操作

时间:2012-02-16 16:05:57

标签: scala casbah scalatra

我正在学习Scala和MongoDB,并且使用Scalatra和Casbah作为简单Web应用程序的框架。

这是一个简单的留言板,有意在Casbah学习CRUD操作。问题是我发现当我列出消息时,我无法在网站上唯一引用MongoDB中的记录。

我目前的代码如下。

我遇到的问题是ObjectID不能转换为字符串。但是如果没有每行的唯一ID,我就无法从网页中提供删除功能。

使用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
            -@ 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"}

1 个答案:

答案 0 :(得分:3)

您无法投射,但您可以在以下情况下轻松将其渲染为字符串:

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

在模板中你可以做到这一点

#{l.id.toString}