私のルートには、サーバーにモデルのリストを要求しようとするメソッドがあります
model: ->
App.MyModel.find
projectId: (@modelFor "project").id
明らかに時々これは404を返すかもしれません。
これが発生した瞬間、Emberは何もしなくなります。ビューはレンダリングされず、コントローラーはセットアップされません。
では、どうすれば404を適切に処理できますか(つまり、エラービューを表示できますか)?
私のルートには、サーバーにモデルのリストを要求しようとするメソッドがあります
model: ->
App.MyModel.find
projectId: (@modelFor "project").id
明らかに時々これは404を返すかもしれません。
これが発生した瞬間、Emberは何もしなくなります。ビューはレンダリングされず、コントローラーはセットアップされません。
では、どうすれば404を適切に処理できますか(つまり、エラービューを表示できますか)?
悪いニュース: 現在、ember-data は find() で 404 を取得しても何もしません。まったく。モデルは永久に「読み込み中」状態になります。
私の意見では、ここには完全に愚かではないオプションはありません。おそらく最後の手段としてnotFound
、DS.Model に属性を追加し、404 を返す代わりに、JSON を にnotFound
設定して返しますtrue
。痛いですよね、わかります…
--- 私は元々find
、 のサブクラスでオーバーライドするソリューションを提供していましたRESTAdapter
。find
次に、ロードされていると思われるレコードインスタンスが渡されないことに気付きました。したがって、レコードをエラー状態にして 404 を処理する必要はありません。
[注: ember-data は 2013 年 3 月以降大幅に変更されたため、この回答の情報は有効でなくなる可能性があります]
ちなみに、「新しい」BasicAdapter がリリースされたばかりです。私にとっての質問は、これにより 404 エラーの処理が容易になるかということでした。
アプローチ #1
私の最初のアプローチは、クリストファーが提案していたものと同様に、HTTP ステータスを含むフィールドを追加することでした。
status: DS.attr("number");
そして、次の AJAX 呼び出しを使用しました。
$.getJSON(url, data).then(null, function(xhr) {
return {
id: id,
statusCode: xhr.status
};
}).always(function(data) {
return process(data).load();
});
これが行うことは、エラー応答 (xhr) を、要求された ID とステータス コードを含むハッシュに変換することです。最後に、成功した結果または失敗したハッシュがストアに渡されます。
この種の方法は機能しますが、あまり実用的ではありません。すべてのモデル インスタンスのリストを表示する場合、それらの「モック」インスタンスを手動で除外する必要があります。
アプローチ #2
もう 1 つのアイデアは、特別なエラー モデルを作成することでした。
App.Error = App.Model.extend({
status: DS.attr("number")
});
そしてそれに応じたクエリ:
$.getJSON(url, data).then(null, function(xhr) {
return App.store.load(App.Error, {}, {
id: 0,
status: xhr.status
});
}).done(function(data) {
return process(data).load();
});
これにより、エラー モデルの新しいインスタンスが読み込まれて作成され、ストアに配置されます。
これの問題は、Ember がこれを実際に「受け入れ」ていなかったことです。アプリケーションはルーティングを停止し、何もしなくなりました。したがって、これも行き止まりのようです:(