我正在尝试重现Railscasts 410示例(称为Raffler
),更改最新版本的设置并符合我的习惯:
在这个示例项目中,我们创建了一个简单的模型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
答案 0 :(得分:4)
我终于找到了问题的原因(感谢this question):这是因为,默认情况下,Mongoid以id
的格式返回带有{"id":{"$oid":"51e5b35b492cd4d286000001"}
的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的行为......不是那么干净......
答案 1 :(得分: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"
问题是什么?