2012-02-16 11 views
2

ScalaとMongoDBを学習しています.ScalatraとCasbahを単純なWebアプリケーションのフレームワークとして使用しています。ScalatraとCasbahを使用したCRUD操作

これは、CasbahでCRUD操作を学習するための簡単なメッセージボードです。問題は、私がメッセージをリストするときに、サイト上のMongoDBのレコードを一意に参照する方法がないことです。

私の現在のコードは以下の通りです。

問題は、ObjectIDを文字列にキャストできないことです。しかし、各行に固有のIDがなければ、Webページから削除機能を提供することはできません。

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

lid.to.toStringアプローチが行われました。その後、削除メソッドで文字列を解析して投稿を削除すると、大変感謝します。 –

+0

なぜ、私はi.getAs [ObjectId]( "_ id")。toStringが機能しないのか知っていただけですか?確かにi.getAs [ObjectId]( "_ id")はObjectIdを返し、ObjectIdは.toStringメソッドを持っているので、なぜi.getAs [ObjectId]( "_ id")。 –

+0

SomeまたはNoneを返すためです。だから、 'toString'は、文字列' Some(文字列としてのあなたのID) ''または文字列 '' None '' –

関連する問題