ruby on rails 3-如何处理Ember REST适配器中找不到的404



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

我在ember数据路线图中看到错误处理还不受支持。

我不明白的是,如果发生错误,Ember为什么不调用Route中的重定向挂钩(我该如何处理此类错误?)

这是路线:

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,我可以检入模板,然后渲染部分模板,但问题是视图根本没有渲染(我认为正是因为同样的问题)。

我要做的是创建一个抽象,然后让您的路由扩展该路由。我已经为您创建了一个工作JSFiddle,但请让我解释一下。

我们的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

我希望这能有所帮助!

相关内容

  • 没有找到相关文章

最新更新