Ember 使用无效的 URL Slug 渲染 404

Posted

技术标签:

【中文标题】Ember 使用无效的 URL Slug 渲染 404【英文标题】:Ember render 404 with Invalid URL Slugs 【发布时间】:2015-02-14 05:06:42 【问题描述】:

为了便于阅读,我在我的应用程序中使用了动态 URL。 url 结构为/[:organization_slug]/[:product_slug]。换句话说,organizationproduct 的所有者。出于安全目的,当有人在 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),它将看起来与路由有效但记录不存在的页面相同。谁能指出我正确的方向?

提前致谢!

【问题讨论】:

【参考方案1】:

我相信您的问题是,当您尝试过渡到“包罗万象”时,Ember.js 不知道那是什么。这很容易解决,因为transitionTo() 采用第二个参数来指定模型,在您的情况下是 URL。

因此,对于一个不存在的产品,您的路线看起来像这样:

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

查看基本工作示例here

【讨论】:

感谢卡尔曼的帮助!我需要的是第二个参数。我稍微修改了您的答案以适用于我的特定情况。

以上是关于Ember 使用无效的 URL Slug 渲染 404的主要内容,如果未能解决你的问题,请参考以下文章

MVC 4 创建 slug 类型 url

Rails 4中友好id gem的随机slug url

使用 Ember.js,如何在渲染视图后运行一些 JS?

Laravel 刀片模板不使用 slug 渲染

如何在加载模型时在Ember中显示加载模板?

htaccess - 限制 url slug 中的单词数