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"
有什么问题?