2013-07-17 83 views
3

我試圖重現Railscasts 410例子(稱爲Raffler),改變設置爲最後版本,並符合我的習慣:灰燼模型只加載最後一個記錄

  • 灰燼1.0.0-rc.6
  • 滑軌4.0.0
  • Mongoid主(4.0)
  • Haml的4
  • 徽0.3.0

在這個示例項目中,我們創建了一個調用小型Rails Rest API的簡單模型Entry

除了調用Raffler.Entry.find()以獲取所有條目只加載最後一條記錄之外,一切都按預期工作。

這裏是我的模型:

Raffler.Entry = DS.Model.extend 
    name: DS.attr('string') 
    winner: DS.attr('boolean') 

我的店:

DS.RESTAdapter.configure('plurals', entry: 'entries') 

Raffler.Store = DS.Store.extend 
    revision: 12 
    adapter: DS.RESTAdapter.create() 

當調用Raffler.Entry.find()有上http://localhost:3000/entries一個AJAX請求,並返回所有記錄(所以我不認爲這個問題是服務器端):

{"entries":[{"id":{"$oid":"51e5b35b492cd4d286000001"},"name":"Foo","winner":true},{"id":{"$oid":"51e5b35b492cd4d286000002"},"name":"Bar","winner":false},{"id":{"$oid":"51e5b384492cd4d286000003"},"name":"Baz","winner":true}]} 

但只有最後一個記錄真的在模型中加載。

在JS控制檯

這裏:

e=Raffler.Entry.find() 
e.toArray().length 
=> 1 
e.objectAt(0).get('name') 
=> "Baz" (always the last one) 
e.objectAt(1) 
=> undefined 
+0

什麼e.toArray的控制檯結果()? –

+0

@Matthew Graves:一個具有單個Ember對象的數組:'[Object {id =「[object Object]」,store = ,_reference = {...},more ...}] '(縮短FF控制檯輸出) –

回答

4

我終於找到了問題的原因(感謝this question):這是因爲默認情況下,Mongoid返回的格式爲{"id":{"$oid":"51e5b35b492cd4d286000001"}id的JSON,Ember似乎並不理解。

通過對我的Rails添加此串行Entry模式:

class EntrySerializer < ActiveModel::Serializer 
    attributes :id, :name, :winner 

    def id 
    object._id.to_s 
    end 

end 

API請求,現在回答這個(注意這裏沒有$oid了):

{"entries":[{"id":"51e5b35b492cd4d286000001","name":"Foo","winner":true},{"id":"51e5b35b492cd4d286000002","name":"Bar","winner":false},{"id":"51e5b384492cd4d286000003","name":"Baz","winner":true}]} 

和灰燼現在加載所有記錄:

Raffler.Entry.find().toArray().length 
=> 3 

編輯:請注意,這是一個Mongoid 4特定問題,因爲$oid表示法在早期版本中未使用。這是一個現有的Rails 3.2/Mongoid 3的測試。0個應用:

1.9.3-p194 :006 > Mongoid::VERSION 
=> "3.0.23" 
1.9.3-p194 :007 > Node.first.id.as_json 
=> "507521e68df996381b00151b" 
我的灰燼測試

現在下軌道4,5/4 Mongoid:

2.0.0-p247 :007 > Mongoid::VERSION 
=> "4.0.0" 
2.0.0-p247 :008 > Entry.first.id.as_json 
=> {"$oid"=>"51e5b35b492cd4d286000001"} 

我已經添加了mongoid標籤我的問題。

的串行解決方案的工作很好,但它意味着創造每一個Mongoid模式串行...只是返回Mongoid 3行爲......不是乾淨......

0

您已經發布了該Raffler.Entry.find()返回此:

{"entries":[{"id":{"$oid":"51e5b35b492cd4d286000001"},"name":"Foo","winner":true},{"id": {"$oid":"51e5b35b492cd4d286000002"},"name":"Bar","winner":false},{"id":{"$oid":"51e5b384492cd4d286000003"},"name":"Baz","winner":true}]} 

比:

e=Raffler.Entry.find() 
e.entries.length 
=> 3 
e.entries[0] 
=> {"id":{"$oid":"51e5b35b492cd4d286000001"},"name":"Foo","winner":true} 
e.entries[0].name 
=> "Foo" 

請告訴我問題?

+0

在這個問題的情況下'Raffler.Entry.find()'是javascript不是rails – intuitivepixel

+0

我也在javascript的上下文中提問。這些輸出值是否錯誤,我在這裏發佈?你有沒有在你的控制檯中試過這些。 –

+0

有沒有錯,但在例如做'e.objectAt(0).get('name')'是ember.js表示法的問題和不同於'e.entries [0] .name' – intuitivepixel