Ember Fixture Adapter未设置记录ID

时间:2014-02-04 09:29:35

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

好的,所以我正在尝试将现有模型复制为新模型实例(因此除了ID之外,所有属性都是相同的。在我的模板中,我有一个动作,copy,它通过了在控制器列表中的那个位置模拟范围,以便可以复制。我的控制器代码如下。我似乎能够创建一个新记录,但它的ID设置为'fixture-0','fixture- 1'等,并在其上调用.save()(见下文)会导致错误,

Uncaught TypeError: Cannot call method 'serialize' of undefined 

由于我目前正在开发模型以进行开发,我正在使用夹具适配器,因为它似乎与问题有关。

控制器代码:

REApp.ApplicationController = Ember.ArrayController.extend({
  actions: {
    copy: function(current_model){
      var self = this;
      console.log(current_model);

      var new_record = this.store.createRecord('cycle', {
        railsId: null,
        accountId: current_model._data.accountId,
        //lots more attributes here
      });

      new_record.save();
      console.log(new_record);
    }
  }
});
来自控制器的

console.log来电,显示new_record

a {id: "fixture-0", store: a, container: t, currentState: Object, _changesToSync: Object…}

注意:即使您从控制器中取出.save()方法调用,也会在id设置为字符串的情况下创建此新记录。如果.save() 被调用(因此控制器中没有出现错误),则新记录将显示在ember检查器的数据面板中,其ID设置为上面的字符串。

这只是我的第三个Ember应用程序(以及我的第一个1.3.0版本),因此我认为我做错了。

编辑: 这是模型定义。如果它是相关的,那么我有其他错误从控制器返回varOfModelObject.save();this.content.save();,因此def认为它与FixtureAdapter有关。

REApp.Cycle = DS.Model.extend({
  //id: DS.attr('number'), not needed with fixtures
  railsId: DS.attr('number'),
  siteId: DS.attr('number'), //all numbers here are ints unless noted
  clientId: DS.attr('number'),
  accountId: DS.attr('number'),
  startAt: DS.attr('datetime'),
  endAt: DS.attr('datetime'),
  chargePerEvent: DS.attr('decimal', {defaultValue: 0.0}),
  createdAt: DS.attr('datetime'),
  updatedAt: DS.attr('datetime'),
  scheduleYaml: DS.attr('string'),
  allDay: DS.attr('boolean'),
  repeat: DS.attr('boolean'),
  exceptionDates: DS.attr('string'),
  additionalDates: DS.attr('string'),
  charge: DS.attr('number'), //decimal in rails
  chargePeriod: DS.attr('string'),
  oldRegularEventId: DS.attr('number'),
  scheduleHuman: DS.attr('string'),
  bagLimit: DS.attr('number'),
  untilDate: DS.attr('number'),
  sendToWebfleet: DS.attr('boolean', {defaultValue: false}),
  contractId: DS.attr('number'),
  hourlyRate: DS.attr('number'), //decimal in rails
  hourlyCharge: DS.attr('number', {defaultValue: 0.0}), //decimal in rails
  doubleEvent: DS.attr('number'),
  //these are used for the simple view 
  weekdays: DS.attr('boolean', {defaultValue: null}),
  weekends: DS.attr('boolean', {defaultValue: null}),
  //data below this needed for associations
  clientName: DS.attr('string'),
  commentBody: DS.attr('string'),
  siteAddress: DS.attr('string'),
  carer1Id: DS.attr('number', {defaultValue: null}),
  carer1Name: DS.attr('string'),
  carer2Id: DS.attr('number', {defaultValue: null}),
  carer2Name: DS.attr('string'),
  users: DS.hasMany('user', {async: true}),
  items: DS.hasMany('item', {async: true})
});

2 个答案:

答案 0 :(得分:0)

如上面的注释中所述,使用fixture时,您可以在内存中创建新对象,但它们与对象ID中的fixture-前缀区别于硬编码的fixture对象。因此,您可能会发现行为有点棘手 - 也许这将在更新版本的Ember Data中修复,但与此同时,答案似乎是使用夹具数据并转移到实时数据情况在开发过程中尽可能快。

答案 1 :(得分:0)

尝试这个并告诉我你得到了什么,是的,在控制台中你会得到一个错误但它有效,只需覆盖方法createrecord如下:

REApp.ApplicationAdapter = DS.FixtureAdapter.extend({
    mockJSON: function(store, type, record) {
      try {
        record.id = Math.floor((Math.random() * 100) + 1);
        return this._super(store, type, record);
      }
      catch(err) {

      }
    },
  }
);