如何处理Ember REST适配器中找不到404

时间:2013-02-08 11:23:52

标签: ruby-on-rails-3 ember.js

我正在使用Ember 1.0.0 pre并使用REST Adapter从Rails API获取对象。 如果通过REST API找到对象并将找到的模型对象设置为视图模型,则呈现模板。为了做到这一点,我使用Route中的模型钩子,一切似乎都很好。 当然,如果找不到模型对象,我想渲染一些特殊的404模板/视图。 问题是如果REST适配器返回错误,模型挂钩将停止处理。

我在ember-data路线图中看到,还不支持错误处理。

我不明白的是,如果发生错误,Ember不会在路由中调用重定向挂钩。(我该如何处理此类错误?)

这是路线:

App.MyRoute = Ember.Route.extend({
  renderTemplate: function() {
  this.render('mymodel')    
  },
  model: function(params) {
    return App.MyModel.find(params.id);
  },
  redirect: function() {
    // I want to redirect to another route
    // if the model is not found via the find method.
    // However, this hook is not called if the previous one
    // does not return an object
  }
})

还有其他解决方案吗?我知道,我可以在模板中检查视图的模型是否为null然后渲染部分模板,但问题是视图根本没有渲染(我假设完全是因为同样的问题)。

1 个答案:

答案 0 :(得分:1)

我要做的是创建一个摘要,然后让你的路线扩展该路线。我created a working JSFiddle for you,但请让我解释一下。

我们的App.IndexRoute可以包含App.MyRedirectRoute中的所有逻辑,但由于其他路由器可能需要相同的功能,因此最好创建一个抽象,以便在/当您再次需要此功能时,您可以只需再次扩展App.MyRedirectRoute以防止重写代码。

不幸的是,Ember.JS没有逻辑来检测模型是否为空并呈现不同的页面。也许在未来这将成为现实! (这很可爱!),但我们可以自己做。

我们的App.IndexRoute很简单:

App.IndexRoute = App.MyRedirectRoute.extend({
    defaultRender: 'home',
    errorRedirectTo: '404',

    model: function(params) {
        // We've found a model!
        return Ember.Object.create({ params: params });
        // We've not found a model!
        return null;
    }
});

如果模型有效,那么我们可以渲染home路线,否则我们将渲染404路线。从路线返回模型没有任何变化。

renderTemplate包含我们用于呈现适当视图的逻辑。因此,我们在摘要中重载renderTemplate方法并执行逻辑操作:

  • 如果Ember.JS认为该模型为空,那么我们将按errorRedirectTo;
  • 的指定呈现视图
  • 如果模型被认为有效,那么我们将按照defaultRender的指定呈现默认值。

如果模型为空,那么我们只需指定我们希望渲染404路线(errorRedirectTo),但默认情况下我们要渲染默认路线(defaultRender

要查看它的实际效果,请查看前面提到的JSFiddle。注释第27行以查看呈现的404页面,因为该对象为null

我希望这有帮助!