14

特異なリソースは ember-data でどのように処理されますか? 次の RESTful ルートがあるとします。

GET /cart
POST /cart
UPDATE /cart
DELETE /cart

ember-data はfind()配列を返すことを想定しており、モデルに渡す URL を自動的に複数形にしようとします。この状況を処理する最善の方法は何ですか?

4

4 に答える 4

7

ここでできることはたくさんあります。

呼び出しは複数形になります。RESTAdapterこれは、名前の末尾に「s」を追加するか、名前が存在する場合は複数形のハッシュで名前を検索します。DS.Modelがであると仮定しますApp.Cart

https://github.com/emberjs/data/blob/master/packages/ember-data/lib/adapters/rest_adapter.js#L209

DS.RESTAdapter.create({
  plurals: {
    cart: 'cart'
  }
});

URLスキームが大きく異なり、さらにロジックが必要な場合は、実際にbuildURL関数をオーバーライドできます。

https://github.com/emberjs/data/blob/master/packages/ember-data/lib/adapters/rest_adapter.js#L288

DS.RestAdapter.create({
  buildURL: function() {
    return "/always_this"
  })
});
于 2012-09-22T01:19:42.433 に答える
3

それで、githubでこのプル リクエストを見つけました。8か月前なので、それ以降複雑さが増したために機能しませんが、次のように提案された回避策を実装しました。

App.store = DS.Store.create({
  revision: 4,
  adapter: DS.RESTAdapter.create({
    plurals: {
      'cart': 'cart'
    }
  })
});

App.Cart.reopenClass({
  find: function () {
    this._super("singleton");
  }
});

サーバー (私はレールを使用しています) では、以下をルートに追加する必要があります。

get "cart/:ignored" => "carts#show"

次に、CartSerializer( active_model_serializers gem を使用して)以下を追加する必要があります。

attributes :id
def id
  "singleton"
end

どうやら、json 応答の ID が find() から要求された ID と一致しない場合 (singletonこの場合)、ember はデータをモデルにロードしないため、これが必要です。

これは明らかに理想的な解決策ではありませんが、ember-data がサポートを追加するまでは、最も簡単な方法のように思えます。

ちなみに、サポートを追加するためにIssueを提出しました。

于 2012-09-22T18:51:42.253 に答える
2

Ember 1.9でこれを機能させる方法は次のとおりです。まず、ガイドのこのセクションを読みました。一番下には、1 つのモデルだけのアダプターをオーバーライドする方法が説明されています。

App.CartAdapter = App.ApplicationAdapter.extend {
  pathForType: ->
    'cart'
}

pathForType 関数は、(少なくとも私が使用している RESTAdapter で) 複数形化が行われる場所であるため、アダプターの他の機能 (ホストや名前空間など) は影響を受けません。

于 2014-11-21T14:15:57.997 に答える
1

私のために働いているより完全なソリューションを共有するために-アプリのApplicationRouterを拡張します(それ自体がDS.RESTAdapterを拡張します)。

App.CartAdapter = App.ApplicationAdapter.extend({
    pathForType: function(type) {
        return 'cart';
    }
});

次に、App.Router.map でリソースを定義します。

this.resource('cart');

最後に、空の文字列をルートの ID として渡します。これにより、ID なしで URL を生成できるようになります。

App.CartRoute = Ember.Route.extend({
    model : function(params) {
        return this.store.find('cart', '');
    }
});
于 2015-02-13T04:33:36.797 に答える