Javascript 正确的Ember.js资源路由声明

Javascript 正确的Ember.js资源路由声明,javascript,ruby-on-rails,ember.js,ember-data,Javascript,Ruby On Rails,Ember.js,Ember Data,我试图把我的头绕到灰烬资源上,但我撞到了墙。查看指南,如我所见,声明资源路由的首选方法是: EmberTester.Router.map(function() { this.resource('posts', function() { this.resource('post', { path: ':post_id' }); }); }); 这看起来非常复杂,必须创建一个嵌套的资源来访问各个项目。但除了样式元素之外,真正的问题是行为:从我在服务器端日志和客户端浏览器流量监控中看

我试图把我的头绕到灰烬资源上,但我撞到了墙。查看指南,如我所见,声明资源路由的首选方法是:

EmberTester.Router.map(function() {
  this.resource('posts', function() {
    this.resource('post', { path: ':post_id' });
  });
}); 
这看起来非常复杂,必须创建一个嵌套的资源来访问各个项目。但除了样式元素之外,真正的问题是行为:从我在服务器端日志和客户端浏览器流量监控中看到的情况来看,这样的路由会评估“post”路由和“post”路由的模型挂钩。也就是说,给定模型挂钩:

EmberTester.PostsRoute = Ember.Route.extend({
  model: function() {
    return EmberTester.Post.find();
  }
});

EmberTester.PostRoute = Ember.Route.extend({
  model: function(params) {
    return EmberTester.Post.find(params.post_id);
  }
});
当访问url
/posts/1
时,两个模型钩子都会执行,因此首先会要求服务器提供所有post,然后再提供post\u id:1。我一定是错过了显而易见的东西,但我无法确定到底是什么

在Ember中声明资源有没有更简单的方法?我是否应该声明资源,而不是使用普通路由?

我创建了一个新的路由来重现您正在讨论的问题,并稍微更改了
路由器
代码:

App.Router.map(function () {
  this.resource('posts');
  this.resource('post', { path: '/posts/:post_id' }); 
});
它的功能与嵌套路由完全相同(我认为,在引擎盖下
post
是嵌套的)

当您导航到
PostsRoute
时,将触发
PostsRoute
model
钩子。如果您单击特定的post,
PostRoute
model
hook将不会被触发

但是,如果您转到一个特定的帖子并刷新页面,您会注意到这次
postwroute
model
hook被触发

您应该将名词用作
资源(post、post、orders等),将动词(形容词)用作
路由(new、show、edit等)


希望这有帮助。

路由器中的嵌套转换为整个堆栈中的嵌套。如果您希望在左侧有一个帖子列表,然后在屏幕的右侧编辑一个单独的帖子(按照),那么嵌套将适合您。如果你不需要这种行为,你根本不需要筑巢你的路线。如果你需要像/posts/comments/这样的相关信息,那么嵌套可能更有用,因为如果没有某种post,你永远找不到评论

另外请注意,如果您没有嵌套,您可能应该如下声明路由器:

App.Router.map(function () {
  this.route('posts');
  this.route('post', { path: '/posts/:post_id' }); 
});

我忽略了将路线嵌套与视图嵌套对齐的重要性。
路线('posts');route('post',{path:'/posts/:post_id');
方法与
resource('posts',function(){route('post',{path:':post_id'});})
的含义不同。第一种方法的作用类似于Rails资源(从列表导航到细节,然后返回),但后者是在客户端上同时显示列表和所选详细信息的合适的余烬资源。+1但我接受@Gevious,因为他指出视图嵌套与路由嵌套对齐的重要性。