私が現在取り組んでいるシステムでは、Ember-data が REST リクエストをどのように処理するかについて少し手なずける必要がありました。デフォルトで ember-data がモデルの特定のリクエストの URL を計算する方法は、私が使用しているバックエンドではうまくいきません。
私が必要としているのは、ember-data を取得して、ember がロードしているのと同じURL を使用することですが、「?json」サフィックスが付いています。つまり、ember がページをバンド ページに切り替え、URL が /bands の場合、ember-data に、モデルの名前から推測されるものではなく、必要なデータの /bands?json を要求する必要があります。使用されているモデルの名前からではなく、ロード ルートのパスから URL を計算する必要があると言えます。
DS.RESTAdapter{} をサブクラス化してみて、buildURL メソッドでこれを実行できるかどうかを確認しましたが、ember がロードする URL を取得する方法がわかりません。ember が場所を変更する前に buildURL メソッドが呼び出されるため、document.location.href などは使用できません。ember に今何を読み込んでいるのか、そして URL は何かを尋ねる方法が必要になると想像できます。
これを行う方法のアイデアはありますか?
アップデート
満足のいく解決策はありませんでしたので、私はただ汚い方法でそれを行うことにしました. これです:
App.RouterSignature = [
['index', '/', '/index_models'],
['bands', '/bands', '/band_models'],
['band', '/band/:band_slug', '/band_model']
];
App.Router.map(function() {
for (var i = 0; i < App.RouterSignature.length; i++) {
var route = App.RouterSignature[i];
this.resource(route[0], {path: route[1]});
}
});
App.CustomAdapter = DS.RESTAdapter.extend({
buildURL: function(record, suffix) {
var url,
suffix = '?json',
needle = this._super(record);
for (var i = 0; i < App.RouterSignature.length && !url; i++) {
var route = App.RouterSignature[i];
if (route[2] == needle)
url = route[1];
}
return url + suffix;
}
});
現在、App.Routes と DS.RESTAdapter.buildURL は同じデータに基づいています。App.RouterSignature リストの最初の 2 つの値は、ルートの名前、つまりルートのパスです。3 番目の値は、DS.RESTAdapter.buildURL がデフォルトで推測する URL です。私のカスタム アダプターはその推測を取得し、それを App.RouterSignature リスト内の項目の 1 つと照合してから、その項目から 2 番目の値 (ルート パス) を取得します。
これで、ember-data が行うリクエストは、ルート パスと同じ URL に対して行われます。