11

私は現在ember + emberdata + router + asp.net web apiと一緒に何かを入れようとしています。そのほとんどはうまくいくようですが、ember-dataが私のモデルのアダプタでfindAllに接続しようとするとエラーメッセージが表示されます。私もお店を持っているEmber-Data: "マッピング"の仕組み

App.Genre = DS.Model.extend({ 
    id: DS.attr("number"), 
    name: DS.attr("string") 
}).reopenClass({ 
    url: 'api/genre' 
}); 

私のアプリでは、私は燃えさし-データを使用して、このようにそれを表現
public class Genre { 
    [Key] 
    public int Id { get; set; } 
    [Required] 
    [StringLength(50, MinimumLength=3)] 
    public string Name { get; set; } 
} 

:私はこのようなモデル(C#)を持っている私のバックエンドで

そのようRESTAdapterを使用して、私のアプリケーションで定義されている:

App.store = DS.Store.create({ 
    revision: 4, 
    adapter: DS.RESTAdapter.create({ 
     bulkCommit: false 
    }) 
}); 

や店舗は以下のように私のコントローラで使用されます。

App.GenreController = Ember.ArrayController.extend({ 
    content: App.store.findAll(App.Genre), 
    selectedGenre: null 
}); 

ルータは、私は自分のアプリケーションを実行すると、私はこれと同じ構造を持っているすべてのオブジェクトのための次のメッセージを取得

App.router = Em.Router.create({ 
    enableLogging: true, 
    location: 'hash', 
    root: Ember.Route.extend({ 
     //... 

     genre: Em.Route.extend({ 
      route: '/genre', 
      index: Ember.Route.extend({ 
       connectOutlets: function (router, context) { 
        router.get('applicationController').connectOutlet('genre'); 
       } 
      }) 
     }), 

     //... 
    }) 
}) 

のように定義されます。参考のために

Uncaught Error: assertion failed: Your server returned a hash with the key 0 but you have no mappings

を、ここですサービスが復帰しているjson:

[ 
    { 
    "id": 1, 
    "name": "Action" 
    }, 
    { 
    "id": 2, 
    "name": "Drama" 
    }, 
    { 
    "id": 3, 
    "name": "Comedy" 
    }, 
    { 
    "id": 4, 
    "name": "Romance" 
    } 
] 

私は問題が何であるかを正確に伝えることができないと主張、私はマッピングが必要であることを言及しているので、私が知りたいのです:

  1. このマッピングとその使用方法は何ですか。
  2. 返されたjsonは配列なので、私のアプリでは別のタイプのコントローラーを使用する必要がありますか、ember-dataでこのタイプのjsonを操作する際に知っておくべきことがありますか?サーバーのJsonFormatterオプションを変更する必要がありますか?

助けてください。

この問題を理解するには不十分だと思われる場合は、さらに詳しい情報を追加できます。

EDIT:私は私のバックエンドでいくつかのことを変更しましたし、今のサーバーでの私のfindAll()同等のアクションは、以下のJSONとして出力をシリアライズ:

{ 
    "genres": [ 
     { "id": 1, "name": "Action" }, 
     { "id": 2, "name": "Drama" }, 
     { "id": 3, "name": "Comedy" }, 
     { "id": 4, "name": "Romance" } 
    ] 
} 

しかし、私はまだ取得することはできませんそれは、クライアントで私のモデルを投入すると、私のエラーメッセージがこれに変更されました:私は間違っているかもしれない他に何わからない

Uncaught Error: assertion failed: Your server returned a hash with the key genres but you have no mappings

を。

この例外をスローするメソッドは、このようなマッピングのsideloadをチェックです:

sideload: function (store, type, json, root) { 
     var sideloadedType, mappings, loaded = {}; 

     loaded[root] = true; 

     for (var prop in json) { 
      if (!json.hasOwnProperty(prop)) { continue; } 
      if (prop === root) { continue; } 

      sideloadedType = type.typeForAssociation(prop); 

      if (!sideloadedType) { 
       mappings = get(this, 'mappings'); 
       Ember.assert("Your server returned a hash with the key " + prop + " but you have no mappings", !!mappings); 
//... 

この呼び出しsideloadedType = type.typeForAssociation(prop);戻りundefinedと、私はエラーメッセージが表示されます。 typeForAssociation()メソッドは、'associationsByName'キーをチェックし、空の場合はEmber.Mapを返します。

現時点ではまだ解決策はありません。ところで

...

私の行動は次のようになりました:

// GET api/genres 
    public object GetGenres() { 
     return new { genres = context.Genres.AsQueryable() }; 
    } 

    // GET api/genres 
    //[Queryable] 
    //public IQueryable<Genre> GetGenres() 
    //{ 
    // return context.Genres.AsQueryable(); 
    //} 

私は設定を見つけることができなかったとして、私はjson.NETによってシリアライズされます元の実装を削除する必要がありましたEmber-Dataが期待するようにjson出力を生成するオプション({resource_name : [json, json,...]}のように)。この副作用は、組み込みのODataサポートを失ったことですが、私はそれを保持したいと思います。誰も私はコレクションのために別のjsonを生成するためにそれを設定することができます知っていますか?

答えて

12

マッピングがDS.RESTAdapterで定義することができる参照、ドキュメントの良好な供給源です。

App.Store = DS.Store.extend({ 
    adapter: DS.RESTAdapter.create({ 
    bulkCommit: true, 
    mappings: { 
     genres: App.Genre 
    }, 
    // you can also define plurals, if there is a unregular plural 
    // usually, RESTAdapter simply add a 's' for plurals. 
    // for example at work we have to define something like this 
    plurals: { 
     business_process: 'business_processes' 
     //else it tries to fetch business_processs 
    } 
    }), 
    revision: 4 
}); 

これはあなたの問題を解決することを願っています。

更新:

このとき私たちは私たち自身がコードを読み取ることによって、それを見つけた、または多分トムデールはそれを指摘している場合、これは十分に文書ではありません、私は覚えていません。
とにかく、ここにポイントがありますplurals マッピングについては、あなたと同じエラーが発生していると思いますが、トムが私たちにこれについて教えてくれました。

+0

両方の答えが役に立った、私は本当にマッピングを設定する場所を知らなかったと思います。今度は、ビューとテンプレートで作業を始めます。ありがとうSylvain – MilkyWayJoe

+0

これで最後のことは、私は 'マッピング'の詳細を見つけることができませんでした。私がどこでそれを見つけたのかを指摘できますか?ソースコードのみであれば?それはreadme thoで利用できるはずです。 – MilkyWayJoe

+0

あなたは大歓迎です:) –

8

RESTAdapterの形式のものに戻るJSONを期待:

{ 
    "genres": [{ 
    "id": 1, 
    "name": "action" 
    },{ 
    "id": 2, 
    "name": "Drama" 
    }] 
} 

試験はhttps://github.com/emberjs/data/blob/master/packages/ember-data/tests/unit/rest_adapter_test.js#L315-329

+0

*」不明なエラーを私は同じフォーマットでJSONを生成するために私のサービスを作るために管理が、今、私はメッセージを取得する:アサーションに失敗しました:サーバーはハッシュを返さ主要なジャンルとのマッピングはありません* "。私は、ember 0.9.1とember-dataを持たないコントローラ/モデルの別のセットをロードすることに成功しました。 – MilkyWayJoe

+0

残念ながら、これはjsonフォーマットではありません。上記のフォーマットを返すようになりました。別のプロパティのための同じメッセージであり、もはやインデックスのためではありません。 – MilkyWayJoe

3

私はEmber Data rev. 11を使用しています。pluralsの設定がDS.RESTAdapter.createで動作しないようです。私は、コードに見て、次のように解決策を見つけた:

App.Adapter = DS.RESTAdapter.extend({ 
    bulkCommit: false 
}) 

App.Adapter.configure('plurals', { 
    series: 'series' 
})