2

ペット プロジェクトとして単純な CMS CouchApp を作成しています。OS X 10.7.4 で CouchDB 1.2.0 を実行しており、Python CouchApp 開発ツールを使用しています。

基本的に、ページをドキュメントとして使用したいのですが、ページはサイトの共有レイアウトを含む別のドキュメントを参照します。

ページ ドキュメントの例:

{
   "_id": "index",
   "_rev": "3-d5451ea54212ae6ec0d8d2d95c5f225d",
   "content": "<img src=\"/images/img.jpg\"/> <p>Lorem ipsum dolor sit amet.</p>",
   "layout": "layouts/default"
}

レイアウト ドキュメントの例:

{
   "_id": "layouts/default",
   "_rev": "1-d2fa96e15ab8768828b262d81265f3d2",
   "content": "<!DOCTYPE html> <html><head> <title>Foo</title> </head><body><div>{{content}}</div></body> </html>"
}

したがって、基本的にページをレンダリングするには、2 つのドキュメントを取得する必要があります。次に、Mustache を使用してページをレイアウトにレンダリングします。

しばらく show 関数をいじりましたが、関数でレイアウト ドキュメントを取得する方法がわかりませんでした。その後、つまずいinclude_docsたので、リスト関数とビューを使用してこれを機能させようとしています。私のマップ機能は次のとおりです。

function(doc) {
    if (doc.layout) {
        emit([doc._id, 1], doc);
        emit([doc._id, 0], {_id: doc.layout });
    }
};

parameters を指定してブラウザーでビュー自体に移動すると、include_docs=true&startkey=["index",0]&endkey=["index",1]正常に動作し、レイアウト ドキュメントが読み込まれます。

ただし、レイアウト ドキュメントはリスト関数に渡されません。前述のビューでこのリスト関数を実行する

function(head, req) {  
    var doc = null;
    var row = getRow();

    do
    {   
        if (!row.value.layout){
            doc = row.value;
        }
    } while (row = getRow())

    for (i in doc) {
        send(i);
    }
}

...同じパラメータでレンダリングします:

_id

少しグーグルで調べたところ、リンクされたドキュメントがリスト関数に渡されないバグが CouchDBにあることに気付きました。私が知る限り、これはすでに修正されているはずです。これは回帰のケースですか、それとも私が遅れているのですか?

4

1 に答える 1

4

行の値はrow.valueに格納されますが、行のドキュメントはrow.docにあります。:)

于 2012-09-09T15:19:12.680 に答える