1

我在加载一些带有 ember-data 的相关模型时遇到问题。我很确定这是我的语法错误,但我只是看不到它。也许有人可以成为我的第二双眼睛?

具体问题是我的模板中没有显示相关模型。

无需再费周折:

笔记

  • 我正在使用ember-appkit-rails.
  • 这是我的第一个 ember 项目,所以请原谅我的 n00bness。
  • 我有一种感觉,答案可能与嵌入有关:“总是”,但我不知道如何将它集成到我的代码中。
  • 调试:Ember:1.4.0 ember.js?body=1:3462
  • 调试:Ember 数据:1.0.0-beta.7+canary.f482da04 ember.js?body=1:3462
  • 调试:车把:1.3.0 ember.js?body=1:3462
  • 调试:jQuery:1.11.0 ember.js?body=1:3462

有问题的模板

我认为这应该可行。它几乎完全来自 ember-appkit-rails 生成器。编剧和作曲家的名字没有出现。

<h3>{{id}}</h3>

<p>{{link-to 'Edit' 'operas.edit' this}} <button {{action destroyRecord this}}>Destroy</button></p>

<ul>
  <li>Title: {{title}}</li>
  <li>Alternate Title: {{alternate_title}}</li>
  <li>Source: {{source}}</li>
  <li>Librettist: {{librettist.name}}</li>
  <li>Composer: {{composer.name}}</li>
  <li>Notes: {{notes}}</li>
</ul>

楷模

歌剧.js.es6

export default DS.Model.extend({
  title: DS.attr('string'),
  alternateTitle: DS.attr('string'),
  source: DS.attr('string'),
  librettistId: DS.attr('number'),
  composerId: DS.attr('number'),
  notes: DS.attr('string'),
  composer: DS.belongsTo('composer'),
  librettist: DS.belongsTo('librettist')
});

librettist.js.es6

export default DS.Model.extend({
  name: DS.attr('string'),
  operas: DS.hasMany('opera')
});

作曲家.js.es6

export default DS.Model.extend({
  name: DS.attr('string'),
  operas: DS.hasMany('opera')
});

ActiveModel 序列化器

class OperaSerializer < ActiveModel::Serializer
  embed :ids, include: true

  attributes :id, :title, :alternate_title, :source, :librettist_id, :composer_id, :notes
  has_one :composer
  has_one :librettist
end

返回的示例 JSON

这是我在看一张歌剧唱片时看到的,但结构适用于整个系列:

{
  "composers": [
    {
      "id": 4097,
      "name": "Müller, Wenzel"
    }
  ],
  "librettists": [
    {
      "id": 1414,
      "name": "Bäuerle, Adolf"
    }
  ],
  "opera": {
    "alternate_title": "oder Wien in einem anderen Weltteile",
    "composer_id": 4097,
    "id": 4166,
    "librettist_id": 1414,
    "notes": "these are some notes",
    "source": "F116.Theater.a.d.Wien.260A.Mus; Mus.Hs.78.Mus; Mus.Hs.25409.Mus",
    "title": "Aline Königin von Golkonda"
  }
}

我也尝试过使用内联嵌入 ( {opera: {...composer: {...}}}) 的这种方法,但效果并不好。

谢谢你的帮助!保罗。

4

1 回答 1

0

如果您将用作客户端适配器,_id则不需要。RESTAdapter

App.Opera = DS.Model.extend({
  title: DS.attr('string'),
  alternateTitle: DS.attr('string'),
  source: DS.attr('string'),
  notes: DS.attr('string'),
  composer: DS.belongsTo('composer'),
  librettist: DS.belongsTo('librettist')
});

App.Librettist = DS.Model.extend({
  name: DS.attr('string'),
  operas: DS.hasMany('opera')
});

App.Composer = DS.Model.extend({
  name: DS.attr('string'),
  operas: DS.hasMany('opera')
});

JSON

{
  "composers": [
    {
      "id": 4097,
      "name": "Müller, Wenzel"
    }
  ],
  "librettists": [
    {
      "id": 1414,
      "name": "Bäuerle, Adolf"
    }
  ],
  "opera": {
    "alternate_title": "oder Wien in einem anderen Weltteile",
    "composer": 4097,
    "id": 4166,
    "librettist": 1414,
    "notes": "these are some notes",
    "source": "F116.Theater.a.d.Wien.260A.Mus; Mus.Hs.78.Mus; Mus.Hs.25409.Mus",
    "title": "Aline Königin von Golkonda"
  }
}

http://emberjs.jsbin.com/OxIDiVU/233/edit

如果您使用的是,ActiveModelAdapter那么您将_id在 json 中使用,这里有一个示例ActiveModelAdapter

http://emberjs.jsbin.com/OxIDiVU/234/edit

于 2014-03-03T05:28:12.473 回答