Ember.js 添加不必要记录的余烬数据

Ember.js 添加不必要记录的余烬数据,ember.js,ember-data,Ember.js,Ember Data,假设我有一个关于动画的应用程序。。 我希望能够通过以下任意URL访问同一动画: /a/foo/1 /a/foo /a/1 因此,我的路由器定义如下: // router.js Router.map(function() { this.resource('animes', { path: '/a/' }, function() { this.route('add'); this.route('remove'); }); this.resour

假设我有一个关于动画的应用程序。。 我希望能够通过以下任意URL访问同一动画:
/a/foo/1

/a/foo

/a/1

因此,我的路由器定义如下:

// router.js
Router.map(function() {
    this.resource('animes', { path: '/a/' }, function() {
        this.route('add');
        this.route('remove');
    });
    this.resource('anime', { path: '/a/:anime_id' });
    this.resource('anime', { path: '/a/:slug/:anime_id' }, function() {
        this.route('edit');
    });
});
我的
动画路线
如下所示:

// routes/anime.js
var AnimeRoute = Ember.Route.extend({
        afterModel: function(anime, transition) {
            // redirect to the url /a/foo/1
        if(anime.get('slug') !== transition.params.anime.slug) {
            this.replaceWith('anime', anime);
        }
    },
    serialize: function(anime) {
        return {
            slug: anime.get("slug"),
            anime_id: anime.get("id")
        };
    } 
});

export default AnimeRoute;
我的后端配置为返回正确的数据,无论发送的是id还是slug。
对于
/a/foo/1
/a/1
形式的url没有问题,但是对于url:
/a/foo
,余烬检查器显示有一个附加记录
{id:foo,title:undefined,slug:undefined,…:undefined}

如何解决这个问题


编辑:这里有一个jsbin说明了这个问题:

因为您有这个.resource('anime',{path:'/a/:anime_id');在您的路线图中,/a/foo将与此匹配,并假设foo是一个id。因为您的后端无论发送什么都返回数据,这可能会把事情搞砸。如果您像这样覆盖AnimeRoute的模型函数,我想应该可以工作:

App.AnimeRoute = Ember.Route.extend({
        model: function(params) {          
          var slug_or_id = params.anime_id;
          if(jQuery.isNumeric(slug_or_id)){ //id
                  return this.store.find('anime',slug_or_id);    
          }else{ //slug
                  return this.store.find('anime', { slug: slug_or_id }).then(function(a) {                      
                           return a.get('firstObject');
                  });   
          }          
    },
    afterModel: function(anime, transition) {
                // redirect to the url /m/foo/1
            if(anime.get('slug') !== transition.params.anime.slug) {
                this.replaceWith('anime', anime);
            }..

编辑:添加了iguider提示,只返回第一个对象。

已经尝试过,但我不知道在调用
this.store.find('anime',{slug:slug\u或\u id})时后端应该返回什么
我认为它需要这样的东西:
{animes:[{id:3,title:“Foo”,slug:“Foo”}
(注意复数动画和响应的数组),这不是我想要的。事实上,当您使用参数查找模型时,您的后端可能会返回多个模型,因此使用复数名称。但是你还看到余烬检查员的附加记录吗?对于多元化问题,您可能可以使用Ember.Inflector.Inflector:当您说:“您的后端可以返回多个模型”时,您的意思是我可以选择返回单个记录吗?如果没有,如何将数组(包含一条记录)转换为一条记录?请编辑您对以下内容的回答,以便我可以接受:替换
返回this.store.find('anime',{slug:slug\u或{u id})
通过
返回this.store.find('anime',{slug:slug\u或})。然后(函数(a){return a.get('firstObject');})