Операции CRUD с использованием Scalatra и Casbah

Я изучаю Scala и MongoDB и использую Scalatra и Casbah в качестве основы для простого веб-приложения.

Это простая доска объявлений, предназначенная для изучения операций CRUD в Casbah. Проблема в том, что я обнаружил, что когда я перечисляю сообщения, у меня нет возможности однозначно сослаться на запись в 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
            -@ 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"}

person Michael Allen    schedule 16.02.2012    source источник


Ответы (1)


Вы не можете бросить, но вы можете легко отобразить его как строку после:

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

И в шаблоне вы могли бы сделать это

#{l.id.toString}
person Andy Petrella    schedule 16.02.2012
comment
Пошел на подход l.id.toString. Затем синтаксический анализ строки обратно в метод удаления, чтобы удалить сообщение, работает большое спасибо. - person Michael Allen; 17.02.2012
comment
Если бы я только знал, почему i.getAs[ObjectId](_id).toString не работает? Конечно, i.getAs[ObjectId](_id) должен возвращать ObjectId, а ObjectId имеет метод .toString, так почему же i.getAs[ObjectId](_id).toString не работает? - person Michael Allen; 17.02.2012
comment
Потому что он возвращает Some или None. Таким образом, toString вернет либо строку "Some(<your id as string>)", либо строку "None". - person Andy Petrella; 17.02.2012
comment
Некоторые? является Some объектом? наверняка i.getAs[class] предполагает, что он вернет объект этого класса? Мне кажется, это не имеет смысла. - person Michael Allen; 17.02.2012
comment
на самом деле это соответствует соглашению scala, чтобы избежать нулевых указателей. Методы извлечения должны возвращать Option[_] вместо _ напрямую. Таким образом, getAs[T] вернет Option[T] (также ознакомьтесь с документацией scala) - person Andy Petrella; 18.02.2012
comment
Some и None на самом деле очень хороши - person grinch; 24.10.2012