【问题标题】:ember-data-1.0.0 activemodeladapter error include an `id` in a hash passed to `push`ember-data-1.0.0 activemodeladapter 错误在传递给“push”的哈希中包含“id”
【发布时间】:2013-12-30 21:58:20
【问题描述】:

我在后端使用 ember-data 和带有 rails 和 mongoid(mongodb) 的 activemodel 适配器。每当我向我的 rails 应用程序发出请求时,emberjs 会显示返回的数据,但在 chrome 开发者控制台中会显示:

Assertion failed: You must include an `id` in a hash passed to `push` 

在 jsfiddle 中重现的问题

我已经在这个 jsfiddle 中重现了这个问题。当我使用 id 而不是 _id 时,您可以看到相同 jsfiddle 的不同版本。

后端发送的负载

ActiveModel 适配器将蛇形大小写 start_date 转换为驼峰形大小写。我已经向 ember-data rest-serializer 添加了一些自定义代码,以将 _id 转换为 id 并且该代码粘贴在这个问题的下方。

    {"schedules":[

       {
         "_id":"529f38596170700787000000",
         "name":"Hair styling",
         "start_date":"2013-12-12"
       }

     ]}

虽然返回的 payload 包含 id,但如果我进入 google cgrome 控制台并运行以下命令并访问 _data ,它表明 id 未定义。

 a = App.__container__.lookup("controller:schedules")
 b = a.get('content')

如果使用控制台中的显示箭头并深入了解 _dat 对象,这就是我所看到的

 _data: Object
   id: undefined

自定义序列化代码

我扩展了 activemodeladapter 来将 mongodb 的 _id 转换为 id 并将其设置为主键。

App.ApplicationSerializer = DS.ActiveModelSerializer.extend({
   primaryKey: '_id',

   normalize: function(type, hash, prop) {
      this.normalizeMongoidId(hash);
      return this._super(type, hash, prop);
   },

   normalizeMongoidId: function(hash){
     var json = { id: hash._id };
     delete hash._id;

     //hash.id = hash._id;
     //delete hash._id;
   }

  /*
   serialize: function(record, options){
     var json = this._super(record, options);

      json.schedule._id  = json.record.id;

      delete json.record.id
      return json;
   }
  */ 
}); 

ember 数据模型

App.Schedule = DS.Model.extend({
  name: DS.attr('string'),
  organization: DS.belongsTo('organization')
});

这是我的 emberjs 路由器

App.Router.map(function(){ 
  this.resource('schedules', {path: "/schedules"}, function(){ 
   this.resource('schedule', {path: "/:schedule_id"}, function(){});   

  }); 
});

emberjs 路由定义

 App.SchedulesRoute = Ember.Route.extend({
   model: function(){
    return this.store.find('schedule');  
   }
 });

emberjs 堆栈跟踪

   Assertion failed: You must include an `id` in a hash passed to `push`   application.js:31601
  (anonymous function) application.js:31601
  Ember.assert application.js:28431
  DS.Store.Ember.Object.extend.push application.js:69415
  (anonymous function) application.js:69483
  Ember.EnumerableUtils.map application.js:30115
  DS.Store.Ember.Object.extend.pushMany application.js:69482
  (anonymous function) application.js:69839
  invokeCallback application.js:36783
  (anonymous function) application.js:36838
  EventTarget.trigger application.js:36621
  (anonymous function) application.js:36921
  DeferredActionQueues.flush application.js:34001
  Backburner.end application.js:34092
  Backburner.run application.js:34131
  Ember.run application.js:34489
  hash.success application.js:74468
  fire application.js:3049
  self.fireWith application.js:3161
  done application.js:8236
  callback

谢谢

【问题讨论】:

  • 你能给出服务器给浏览器的错误和响应的完整堆栈跟踪吗
  • ember 错误很奇怪,但从您的日志中可以看出该错误在 Rails 服务器上(响应错误 500),请给我们您的schedulers_controller.rb 吗?
  • @AdrienCoquio 将完整的 schedules_controller.rb 粘贴在标题为 从 emberjs 到 rails 的部分下
  • @Hardik127,来自 emberjs 端的堆栈跟踪粘贴在问题下方。对于 rails 方面,我之前粘贴的是返回的所有堆栈跟踪。我检查了 chrome 控制台中返回的对象,它没有 id ,即使它收到的 json 有一个 id。这是有效载荷 {"schedules":[{"id":{"$oid":"529f38596170700787000000"},"name":"Hair Style","description":null,"start_date":"2013 -12-12","end_date":null,"organization":null}]}
  • 我已经在 jsfiddle 中重现了未解决的问题,因为我已经解决了所有与后端相关的问题。但是,仍然会抛出 emberjs 错误。这是 jsfiddle。当我使用 id 而不是 _id 时,您可以看到相同的 jsfiddle 工作。

标签: ember.js ember-data ember-router


【解决方案1】:

我有同样的问题。在你的 Rails 序列化程序中,(假设你有一个),你应该这样做

attributes :id, :name, :start_date

并且有一个

has_many :schedule 

在您的 SchedulesSerializer 中。让我知道这是否有效。

【讨论】:

    猜你喜欢
    • 2014-01-18
    • 1970-01-01
    • 2014-10-21
    • 2023-03-17
    • 1970-01-01
    • 2011-06-14
    • 2018-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多