特異なリソースは ember-data でどのように処理されますか? 次の RESTful ルートがあるとします。
GET /cart
POST /cart
UPDATE /cart
DELETE /cart
ember-data はfind()
配列を返すことを想定しており、モデルに渡す URL を自動的に複数形にしようとします。この状況を処理する最善の方法は何ですか?
特異なリソースは ember-data でどのように処理されますか? 次の RESTful ルートがあるとします。
GET /cart
POST /cart
UPDATE /cart
DELETE /cart
ember-data はfind()
配列を返すことを想定しており、モデルに渡す URL を自動的に複数形にしようとします。この状況を処理する最善の方法は何ですか?
ここでできることはたくさんあります。
呼び出しは複数形になります。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"
})
});
それで、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を提出しました。
Ember 1.9でこれを機能させる方法は次のとおりです。まず、ガイドのこのセクションを読みました。一番下には、1 つのモデルだけのアダプターをオーバーライドする方法が説明されています。
App.CartAdapter = App.ApplicationAdapter.extend {
pathForType: ->
'cart'
}
pathForType 関数は、(少なくとも私が使用している RESTAdapter で) 複数形化が行われる場所であるため、アダプターの他の機能 (ホストや名前空間など) は影響を受けません。
私のために働いているより完全なソリューションを共有するために-アプリの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', '');
}
});