0

我有一个示例笔记本应用程序,可与 ember-cli 的 HTTP 模拟以及使用 ActiveModelSerializer 的 rails 后端一起使用。

当我用 ember-fire 将它连接到 firebase 时,我可以注册一个用户(我在仪表板中看到它)但是当我尝试通过电子邮件检索它时,我收到以下警告:

WARNING: Encountered "0" in payload, but no model was found for model name "0" (resolved model name using ui@serializer:application:.modelNameFromPayloadKey("0"))

那么这个错误:

Error: Assertion Failed: You must include an 'id' for undefined in an object passed to 'push'
    at new Error (native)
    at Error.EmberError (http://localhost:4200/assets/vendor.js:24735:21)
    at assert (http://localhost:4200/assets/vendor.js:14636:13)
    at Object.assert (http://localhost:4200/assets/vendor.js:22037:34)
    at ember$data$lib$system$store$$Service.extend._pushInternalModel (http://localhost:4200/assets/vendor.js:75316:15)
    at ember$data$lib$system$store$$Service.extend.push [as _super] (http://localhost:4200/assets/vendor.js:75302:34)
    at push (http://localhost:4200/assets/vendor.js:94940:38)
    at superWrapper [as push] (http://localhost:4200/assets/vendor.js:30984:22)
    at http://localhost:4200/assets/vendor.js:70210:27
    at Object.Backburner.run (http://localhost:4200/assets/vendor.js:9707:25)

我正在使用以下方式查询商店:

export default Ember.Route.extend({
  actions: {
    login: function() { 
      this.store.query('user', {
        email: this.controller.get('email') 
      }).then((users) => {
        if(users.get('length') === 1) {
          var user = users.objectAt(0); 
          this.controllerFor('application').set('user',user); 
          this.transitionTo('notebooks', user.get('id'));
        }
        else {
          console.log('unexpected query result'); 
        }
     }); 
    }
  } 
});

深入研究,我可以通过在 finders.js#157 处设置断点来查看我即将

store._adapterRun(function () { var payload = normalizeResponseHelper(serializer, store, typeClass, adapterPayload, null, 'query'); //TODO 优化记录 = store.push(payload); });

推送有效载荷。适配器有效负载检查到

adapterPayload: Array[1]
   0: Object 
       email: "test@test.com"
       first_name: "Test"
       id: "-K1oINClDw2ylQLww7-p"
       last_name: "User"

这是我的用户。所以一切都很好,除了痕迹。不确定该 ID,但我是 firebase 新手;也许没关系。它与我在仪表板中看到的相符。

我的序列化程序没有做任何特别的事情——它是香草。

import DS from 'ember-data';

export default DS.RESTSerializer.extend({
});

AFAIK 我正在使用最新最好的——这里是 bower.json

{
  "name": "ui",
  "dependencies": {
    "ember": "2.1.0",
    "ember-cli-shims": "ember-cli/ember-cli-shims#0.0.4",
    "ember-cli-test-loader": "ember-cli-test-loader#0.1.3",
    "ember-data": "2.1.0",
    "ember-load-initializers": "ember-cli/ember-load-initializers#0.1.7",
    "ember-qunit": "0.4.9",
    "ember-qunit-notifications": "0.0.7",
    "ember-resolver": "~0.1.18",
    "jquery": "^2.1.4",
    "loader.js": "ember-cli/loader.js#3.2.1",
    "qunit": "~1.18.0",
    "foundation": "~5.5.3",
    "bootstrap": "~3.3.5",
    "showdown": "~1.3.0",
    "firebase": "^2.1.0"
  }
}

和我在 package.json 中的开发依赖项

  "devDependencies": {
    "body-parser": "^1.14.1",
    "broccoli-asset-rev": "^2.1.2",
    "ember-cli": "1.13.8",
    "ember-cli-app-version": "1.0.0",
    "ember-cli-babel": "^5.1.3",
    "ember-cli-dependency-checker": "^1.0.1",
    "ember-cli-htmlbars": "1.0.1",
    "ember-cli-htmlbars-inline-precompile": "^0.3.1",
    "ember-cli-ic-ajax": "0.2.1",
    "ember-cli-inject-live-reload": "^1.3.1",
    "ember-cli-qunit": "^1.0.0",
    "ember-cli-rails-addon": "0.0.12",
    "ember-cli-release": "0.2.3",
    "ember-cli-showdown": "2.5.0",
    "ember-cli-sri": "^1.0.3",
    "ember-cli-uglify": "^1.2.0",
    "ember-data": "2.1.0",
    "ember-disable-proxy-controllers": "^1.0.0",
    "ember-export-application-global": "^1.0.3",
    "emberfire": "1.6.0",
    "express": "^4.13.3",
    "glob": "^4.5.3",
    "morgan": "^1.6.1",
    "nedb": "^1.2.1"
  }

任何指针/帮助/指导都会很棒!我也是 ember 的新手,所以也许我错过了明显的东西?

4

1 回答 1

0

您需要从后端返回类型键,而不仅仅是发送数组。这让 Ember Data 知道您要推送到商店的模型类型。您的有效负载应如下所示:

users: [
  {
    email: "test@test.com",
    id: "abcdefg"
    (...)
  }
]

而不是这个

[
  {
    email: "test@test.com",
    id: "abcdefg"
    (...)
  }
]

或者,您可以显式传入类型和数据:

store.push("user", store.normalize("user", response[0]));

(其中响应仍然是数组)

于 2015-10-30T15:12:31.480 回答