【问题标题】:Ember model only loads last recordEmber 模型只加载最后一条记录
【发布时间】:2013-07-17 18:18:05
【问题描述】:

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

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

【问题讨论】:

  • e.toArray() 的控制台结果是什么?
  • @Matthew Graves:具有单个 Ember 对象的数组:[Object { id="[object Object]", store=<Raffler.Store:ember330>, _reference={...}, more...}](缩短的 FF 控制台输出)

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


【解决方案1】:

我终于找到了问题的原因(感谢this question):这是因为默认情况下,Mongoid 以{"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 标签添加到我的问题中。

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

【讨论】:

    【解决方案2】:

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

    有什么问题?

    【讨论】:

    • 在这个问题的情况下Raffler.Entry.find() is javascript not rails
    • 我也在 javascript 的上下文中询问。我在这里发布的这些输出值是错误的吗?您是否在控制台中尝试过这些。
    • 没有错,但在问题中,例如做e.objectAt(0).get('name')是ember.js符号,与做e.entries[0].name不同
    • e.entries 甚至不存在。 Raffler.Entry.find() 不会返回 JSON,但会生成一个以 JSON 为输出的 API 请求。问题是 Rails API 返回 3 个条目,而 Ember 只加载最后一个。
    猜你喜欢
    • 2021-07-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2011-12-10
    • 1970-01-01
    • 2013-03-11
    • 2015-07-21
    • 1970-01-01
    相关资源
    最近更新 更多