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

时间:2013-07-17 06:40:28

标签: ruby-on-rails ember.js mongoid ember-data

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

  • Ember 1.0.0-rc.6
  • Rails 4.0.0
  • Mongoid master(4.0)
  • Haml 4
  • Emblem 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

2 个答案:

答案 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"

问题是什么?