3

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

  • 灰烬 1.0.0-rc.6
  • 导轨 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()有一个 AJAX 请求http://localhost:3000/entries并返回所有记录(所以我不认为问题出在服务器端):

{"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
4

2 回答 2

4

我终于找到了问题的原因(感谢这个问题):这是因为默认情况下,Mongoid 返回 JSONid格式{"id":{"$oid":"51e5b35b492cd4d286000001"}为,Ember 似乎无法理解。

通过在我的 RailsEntry模型上添加这个序列化程序:

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标签添加到我的问题中。

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

于 2013-07-17T08:54:40.833 回答
0

You have posted that Raffler.Entry.find() returns this :

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

than :

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

Whats the problem?

于 2013-07-17T07:12:37.623 回答