Я использую динамические URL-адреса в своем приложении для удобства чтения. Структура URL составляет /[:organization_slug]/[:product_slug]
. Другими словами, organization
является владельцем product
. В целях безопасности я хочу отобразить 404, когда кто-то вводит организацию в URL-адрес, когда он не существует. Также аналогичным образом отобразите 404, когда продукт, который не существует, вводится в URL-адрес.Ember render 404 with Invalid URL Slugs
Я реализовал Ember 404, как описано in this post. Затем я подключаюсь к 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, который работает неправильно. Если я изменю path
маршрута 404 на статическую строку, такую как /404
, переход работает. Тем не менее, я хотел бы сохранить URL-адрес исходного запроса, если это возможно.
Таким образом, если кто-то запрашивает маршрут, который на самом деле не существует (т.е. /foo/bar/baz
), это будет выглядеть идентично на страницу, где маршрут действителен, но запись не существует. Может кто-то указать мне верное направление?
Заранее благодарен!
Спасибо за помощь Калмана! Мне нужен был второй параметр. Я немного изменил ваш ответ, чтобы работать в моем конкретном случае. –