【发布时间】:2015-02-14 05:06:42
【问题描述】:
为了便于阅读,我在我的应用程序中使用了动态 URL。 url 结构为/[:organization_slug]/[:product_slug]。换句话说,organization 是product 的所有者。出于安全目的,当有人在 URL 中键入不存在的组织时,我想显示 404。同样,在 URL 中输入不存在的产品时显示 404。
我已经按照in this post 的描述实现了 Ember 404。然后,我连接到afterModel 以查看查询是否返回了记录,如果没有则尝试转换到fourOhFour 路由。这是我目前的相关代码:
router.js
Router.map(function() {
this.route("fourOhFour", {path: "*path"});
this.resource('organization', {path: ':organization_slug'}, function() {
this.resource('product', {path: ':product_slug'});
});
});
routes/organization.js
var OrganizationRoute = Ember.Route.extend({
model: function(params) {
return this.store.find('organization', {slug: params.organization_slug});
},
afterModel: function(organization, transition) {
if(organization.get('length') === 0) {
//If it's not a correct URL render the 404
this.transitionTo("fourOhFour");
}
},
serialize: function(model) {
return {organization_slug: model.get('slug')};
}
});
export default OrganizationRoute;
routes/product.js
var ProductRoute = Ember.Route.extend({
model: function(params) {
var self = this;
// Verify that the product belongs to the organization in the URL
return this.store.find('organization', {slug: Ember.organizationSlug}).then(function(organization) {
var organizationID = organization.get('firstObject.id');
return self.store.find('product', {slug: params.product_slug, organization: organizationID});
});
},
afterModel: function(product) {
if(product.get('length') === 0) {
this.transitionTo("fourOhFour");
}
},
serialize: function(model) {
return {product_slug: model.get('slug')};
}
});
export default ProductRoute;
问题是过渡没有触发。路线未激活,模板未呈现。我认为这与由于动态 URL 的性质而存在路由的事实有关。但是,我想维护 URL 路径但显示 404 模板,该模板无法正常工作。如果我将 404 路由的 path 更改为像 /404 这样的静态字符串,则转换有效。但是,如果可能,我想保留原始请求的 URL 路径。
这样,如果有人请求实际上不存在的路由(即/foo/bar/baz),它将看起来与路由有效但记录不存在的页面相同。谁能指出我正确的方向?
提前致谢!
【问题讨论】:
标签: javascript ember.js ember-data url-routing slug