2014-12-15 2 views
0

Я использую динамические 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), это будет выглядеть идентично на страницу, где маршрут действителен, но запись не существует. Может кто-то указать мне верное направление?

Заранее благодарен!

ответ

2

Я считаю, что ваша проблема в том, что, когда вы пытаетесь перейти в «поймать все», Ember.js понятия не имеет, что это такое. Это легко исправить, так как transitionTo() принимает второй параметр для указания модели, которая в вашем случае будет URL.

Таким образом, для несуществующего продукта, ваш маршрут будет выглядеть примерно так:

App.BadRoute = Ember.Route.extend({ 
    model: function(){ 
    return "abcdproduct"; 
    }, 
    afterModel: function(badProduct){ 
    this.transitionTo('notFound', badProduct); 
    } 
}); 

См базовый рабочему примеру here

+0

Спасибо за помощь Калмана! Мне нужен был второй параметр. Я немного изменил ваш ответ, чтобы работать в моем конкретном случае. –