2013-04-18 6 views
5

EmberjsアプリケーションでHTTPステータス未承認(401)を処理します。Ember-dataがhttpステータスを受信すると、Ember.jsアプリケーションがログインにリダイレクトする必要があります。401

このアプリケーションでは、ember-dataを使用してJSON API(Rails)を統合しています。

クライアント層(Emberjs)は、HTTPステータス未承認(401)を受信すると、ログインを求めるEmberjsビュー/テンプレートにリダイレクトする必要があります。

アプリケーション全体に対してこれを行うにはどうすればよいですか?

答えて

5

私は同じ問題を抱えています。私は次のハックを成功裏に実装しました。

window.App = Em.Application.extend 
    ready: -> 
    $(document).ajaxError((event, request, settings) => 
     if request.status == 401 && !["/profile", "https://stackoverflow.com/users/sign_in.json"].contains(settings.url) 
     controller = App.__container__.lookup('controller:application') 
     controller.transitionToRoute('sign_in') 
) 

アイデアは、jQuery ajaxErrorイベントをキャッチすることです。イベントの種類でエラーの種類(例:request.status == 401)、エラーの原因となったURL(settings.urlなど)を確認し、その情報に基づいて何をすべきかを判断できます。これは私がより良い方法を考えている

+3

これは次のように今ルータで処理される必要があります:http://stackoverflow.com/questions/17981563/ember -data-handling-401s –

0

を助け

希望はエンバーの約束を使用することです:

@store.get("user").then(=> 
    # Success stuff here 
).fail(=> 
    @transitionTo("login") # Do other fancy error stuff here too 
) 

これに伴う問題は、それが個別にすべての経路で行わなければならないということです。おそらく、beforeTransitionメソッドで何かできますか?思考のためだけの食糧。

8

私は同じトピックについて研究していましたが、ここの情報はちょっと古いものです。 Ember 1.7.0を使用すると、ルートのエラーを処理する必要があります。 read here

更新:であなたが全体のアプリにこれを適用したい場合は、ドキュメントは、それを説明するように、これは同様であるので、

// app/routes/application.js 
import Ember from 'ember'; 

var ApplicationRoute = Ember.Route.extend({ 
    actions: { 
     error: function (error, transition) { 
      // Handle the error here 
      if (error && error.status === 401) { 
       return this.transitionTo('login'); 
      } 
     } 
    } 
}); 

export default ApplicationRoute; 

のように、あなたのApplicationRouteクラスに追加する必要があります新しいバージョンのEmberとEmber Dataでは、エラーオブジェクトの構造は少し異なります。ステータスは、エラーオブジェクト内のエラーオブジェクト内のエラー配列内の文字列になります。

actions: { 
    error: function(error, transition) { 
    if (error.errors[0].status === '401') { 
     this.transitionTo('sign-in'); 
    } 
    } 
} 
関連する問題