【问题标题】:CRUD operations using Scalatra and Casbah使用 Scalatra 和 Casbah 的 CRUD 操作
【发布时间】:2012-02-17 00:29:06
【问题描述】:

我正在学习 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"}

【问题讨论】:

    标签: scala casbah scalatra


    【解决方案1】:

    你不能转换,但你可以很容易地把它渲染成一个字符串:

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

    在模板中你可以这样做

    #{l.id.toString}
    

    【讨论】:

    • 采用 l.id.toString 方法。然后在删除方法中解析字符串以删除帖子,非常感谢。
    • 现在如果我知道为什么 i.getAs[ObjectId]("_id").toString 不起作用?当然 i.getAs[ObjectId]("_id") 应该返回一个 ObjectId 并且 ObjectId 有一个 .toString 方法,那么为什么 i.getAs[ObjectId]("_id").toString 不起作用?
    • 因为它返回 Some 或 None。所以toString 将返回字符串"Some(&lt;your id as string&gt;)" 或字符串"None"
    • 一些? Some 是一个对象吗?肯定 i.getAs[class] 建议它会返回该类的对象吗?对我来说似乎没有意义。
    • 实际上,避免空指针是为了遵守 scala 约定。检索方法应直接返回 Option[_] 而不是 _。所以 getAs[T] 将返回一个 Option[T] (也请查看 scala 文档)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-23
    相关资源
    最近更新 更多