ember数据不保存外键,发送为null

时间:2015-11-04 10:36:40

标签: ember.js foreign-keys ember-data

我的余烬应用程序没有将我的外键发送到后端。

我有一个名为 issues 的表,它有一个名为 categories 的相关表

我的模特是:

import DS from 'ember-data';

export default DS.Model.extend({
    name:           DS.attr('string'),
    category_id:    DS.belongsTo('category'),
    description:    DS.attr('string')
});

我的路线是:

import Ember from 'ember';

export default Ember.Route.extend({
  model: function(){
    return this.store.findAll('issue');
  },
  actions: {
    create: function(){

        var issue = this.store.createRecord('issue');
        issue.name = this.get('controller').get('newName');
        issue.description = this.get('controller').get('newDescription');
        issue.category_id = parseInt(this.get('controller').get('newCategory'));
        //debugger;

        console.log(issue);
        issue.save();
    },
    ...
    other actions 
    ...
    }
  }
});

上面的console.log看起来正确设置了category_id:

category_id: 3
description: "foobar"
name: "test"

然而,我发送到后端的JSON有效负载如下所示:

{"issue":{"name":"test","description":"foobar","category_id":null}}

我尝试通过在app / serializers / application.js

中添加自定义序列化器来逐步完成
export default DS.RESTSerializer.extend({
  ...

    serialize: function(snapshot,options){
      console.debug('options='+options);
      debugger;
      var json = this._super(snapshot, options);;

      return json;
    }
  ...
  });

但是我迷失了所有超级调用的超级间接。

snapshot.record category_id: 3,但是来自this._super()调用的 json category_id: null

选项includeID:true

任何线索都会受到赞赏......

Ember:2.0.2
Ember数据:2.0.0

1 个答案:

答案 0 :(得分:0)

您的模型定义错误,在处理您定义它们的关系时,就像定义任何其他属性一样,不需要使用_id

export default DS.Model.extend({
    name:           DS.attr('string'),
    category:    DS.belongsTo('category'),
    description:    DS.attr('string')
});

至于创建时,在处理ember对象时应始终使用setter / getter:

create: function() {
  var issue = this.store.createRecord('issue', {
    name: this.get('controller').get('newName'),
    description: this.get('controller').get('newDescription'),
    category: this.get('controller').get('newCategory') // assuming new category is a DS.Model instance of category
  });
  issue.save();
}

如果您希望坚持使用issue.set('name', this.get('controller').get('newName'))的语法,从代码的外观来看,您似乎是以错误的方式解决这个问题。

您应该在问题路线下嵌套this.route('new'),这样您就不必使用控制器来存储信息。

您只需将新路线的型号设置为:

model: function() {
  return this.store.createRecord('issue');
}

您的模板会像input helpers那样使用:

{{input value=model.name}}您的操作只会获得currentModel并致电.save()