【问题标题】:Formatting Rabl for Ember or Mapping Ember to Rabl?为 Ember 格式化 Rabl 或将 Ember 映射到 Rabl?
【发布时间】:2013-05-01 17:29:47
【问题描述】:

我的 rails 应用程序曾经生成如下所示的 JSON:

{"paintings":
  [
    {"id":1,"name":"a"},
    {"id":2,"name":"b"}
  ]
}

我添加了 rabl json 格式,现在 json 看起来像这样:

[
  {"id":1,"name":"a"},
  {"id":2,"name":"b"}
]

Ember 告诉我

Uncaught Error: assertion failed: Your server returned a hash with the key 0 but you have no mapping for it 

如何让 Ember 理解这一点?或者我应该如何让 rabl 可以理解为 ember?

【问题讨论】:

    标签: ruby-on-rails json ember.js ember-data rabl


    【解决方案1】:

    找到了解决办法。我的 index.json.rabl 看起来像这样:

    collection @paintings 
    extends 'paintings/show'
    

    现在看起来像这样:

    collection @paintings => :paintings
    extends 'paintings/show'
    

    【讨论】:

    • 这实际上可能会更好,因此您不必扩展序列化程序
    • 在这种情况下是的,但我也试图更好地理解序列化程序
    【解决方案2】:

    您可以扩展DS.RESTSerializer 并更改extractextractMany。以下只是我在 .NET 中使用的序列化程序的复制和粘贴,用于相同的场景:

    window.App = Ember.Application.create();
    var adapter = DS.RESTAdapter.create();
    var serializer = Ember.get( adapter, 'serializer' );
    serializer.reopen({
        extractMany: function (loader, json, type, records) {
            var root = this.rootForType(type);
            root = this.pluralize(root);
            var objects;
    
            if (json instanceof Array) {
                objects = json;
            }
            else {
                this.sideload(loader, type, json, root);
                this.extractMeta(loader, type, json);
                objects = json[root];
            }
    
            if (objects) {
                var references = [];
                if (records) { records = records.toArray(); }
    
                for (var i = 0; i < objects.length; i++) {
                    if (records) { loader.updateId(records[i], objects[i]); }
                    var reference = this.extractRecordRepresentation(loader, type, objects[i]);
                    references.push(reference);
                }
    
                loader.populateArray(references);
            }
        },
        extract: function (loader, json, type, record) {
            if (record) loader.updateId(record, json);
            this.extractRecordRepresentation(loader, type, json);
        }
    });
    

    在设置商店之前,您必须配置模型以正确加载:

    serializer.configure( 'App.Painting', {
        sideloadAs: 'paintings'
    } );
    
    App.Store = DS.Store.extend({
        adapter: adapter,
        revision: 12
    });
    

    现在您应该能够将无根 JSON 负载加载到您的应用中。

    (见fiddle

    【讨论】:

    • 谢谢,这是我一直在寻找的答案。
    猜你喜欢
    • 1970-01-01
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多