を使用して、アプリケーション内の無効なルートを処理する方法を理解しようとしていますEmber.Router
。
現在、myapp.com /#FooBarDoesntExistなどの無効なルートを入力すると、インデックスルート('/')にリダイレクトされます。何が起こったのかをユーザーに知らせることができるように、ルーティング先のnotFoundまたは404状態を定義できればと思います。それらがホームページにダンプされるのとは対照的に。
を使用して、アプリケーション内の無効なルートを処理する方法を理解しようとしていますEmber.Router
。
現在、myapp.com /#FooBarDoesntExistなどの無効なルートを入力すると、インデックスルート('/')にリダイレクトされます。何が起こったのかをユーザーに知らせることができるように、ルーティング先のnotFoundまたは404状態を定義できればと思います。それらがホームページにダンプされるのとは対照的に。
現在のバージョンの Ember.Router は、未知のルートを処理する手段を提供していません。ハッキングする時間です!
ここでの考え方は次のとおりです。Ember.Router.route(path)
要求された (潜在的に不明な) パスで呼び出されるメソッドがあります。このメソッドの呼び出し後、ルーターのパスが既知であることが保証されます。そのため、要求されたパスと実際のパスを比較してそれらが異なる場合、要求されたパスは無効であり、ユーザーを 404 ページにリダイレクトする可能性があります。
App.Router = Ember.Router.extend({
route: function(path) {
this._super(path);
var actualPath = this.get("currentState").absoluteRoute(this);
if (path !== actualPath) {
this.transitionTo("404page");
}
}
});
このソリューションは非常に高価です。たとえば、現在の状態が「/a/b/c」で、ユーザーが「/b/d/e/unknown」に移動したい場合、ルーターは既知の状態「b」、「d」、および「e」、そしてその場合にのみ、パスを不明として破棄します。実際のルーティングが開始される前に、これを伝えることができればよいでしょう。
ここでは、指定されたパスの有効性を確認してから、ルーターに続行するように指示します。
App.Router = Ember.Router.extend({
checkPath: function (path) {
path = path.replace(this.get('rootURL'), '').replace(/^(?=[^\/])/, "/");
var resolvedStates = this.get("states.root").resolvePath(this, path);
var lastState = resolvedStates.get("lastObject");
return lastState.match.remaining == "";
},
route: function(path) {
if (this.checkPath(path)) {
this._super(path);
} else {
this.transitionTo("404page");
}
}
});
このソリューションには欠点もありますresolvePath
。プライベートとしてマークされたメソッドを使用します。それにもかかわらず、最初のソリューションよりも効果的であるため、このソリューションを使用します。
Ember 1.13 でこれを行うために推奨される方法は、キャッチオール ルートを作成することです。
Router.map(function () {
this.route('home');
this.route('login');
this.route('404', { path: '/*path' }); // capture route in path
});
次に、404 テンプレートを に入れます404.hbs
。