Ember模型仅加载最后一条记录

我正在尝试重现Railscasts 410示例(称为Raffler ),更改最新版本的设置并符合我的习惯:

  • Ember 1.0.0-rc.6
  • Rails 4.0.0
  • Mongoid大师(4.0)
  • 哈姆尔4
  • 会徽0.3.0

在这个示例项目中,我们创建了一个简单的模型Entry ,它调用一个小的Rails Rest API。

一切都按预期工作,除了调用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 

我终于找到了问题的原因(感谢这个问题 ):这是因为,默认情况下,Mongoid返回id{"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}]} 

和Ember现在加载所有记录:

 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" 

现在我在Rails 4 / Mongoid 4下进行Ember测试:

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

我在我的问题中添加了mongoid标签。

Serializer解决方案运行良好,但它意味着为每个Mongoid模型创建一个序列化器......只是为了返回Mongoid 3的行为......不是那么干净......

您已发布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" 

有什么问题?