2013-12-12 19 views
6

我在後端使用了ember-data和activemodel適配器,其中包含rails和mongoid(mongodb)。每當我做我的rails應用程序的請求,emberjs顯示返回的數據,但在Chrome開發者控制檯,它顯示:ember-data-1.0.0 activemodeladapter錯誤包括傳遞給`push`的散列中的`id`

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

中的jsfiddle

重現的問題,我已經在這個問題再次出現, jsfiddle。您可以看到不同版本的jsfiddle當我使用ID而不是_id。後端發出

有效載荷

適配器加載ActiveModel轉換snake_case 起始日期駱駝情況。我已經添加了一些自定義代碼到ember-data rest-serializer來將_id轉換爲id並且該代碼在此問題中被粘貼更低。

{"schedules":[ 

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

    ]} 

現在雖然回到有效載荷包括ID,如果我進入谷歌cgrome控制檯並運行以下commmands並訪問_data,它顯示了ID是不確定的。

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

I F使用本公開箭頭控制檯和挖入_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; 
    } 
    */ 
}); 

餘燼的數據模型

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 

感謝

+0

你可以給服務器給瀏覽器的錯誤和響應的完整堆棧跟蹤 – Hardik127

+0

該燼錯誤是奇怪的,但從你看到的日誌看起來像錯誤是在Rails服務器(迴應錯誤500),請你請給我們你的'schedulers_controller.rb'? –

+0

@AdrienCoquio將完整的** schedules_controller.rb **粘貼在標題爲**從emberjs到rails ** – brg

回答

0

我有同樣的問題。在Rails串行的時間表,(假設你有一個),你應該做

attributes :id, :name, :start_date 

,並有

has_many :schedule 
在SchedulesSerializer

。讓我知道這個是否奏效。

相關問題