0

私は Ember.js 1.0.0 と Ember-Data-beta2 を使用しています。

Product私は属しているモデルを持っていますCompany。製品を作成するとき、ユーザーはドロップダウン メニューで所属する会社を選択できます。"company":"25"これは、フォームの投稿に追加されます。これは、ほとんどの場合、私が望むものです。ただし、代わりに"company"、フォームを送信する必要があり"company_id"ます。どうすればこれを変更できますか?

私の知る限り、Ember-Data シリアライザーは受信データのみを正規化し、送信データは正規化しません。これはアダプタで処理されますか? もしそうなら、どうやってこの規則を Ember に伝えますか?

4

2 に答える 2

4

編集: このソリューションは古くなっています。Panagiotis Panagi が提案しているように、代わりに ActiveModelAdapter を使用してください。

最近のバージョンの ember-data では、「レールに優しい動作」を得るために、シリアライザーをオーバーライドする必要があります。そのようです:

// See https://github.com/emberjs/data/blob/master/TRANSITION.md
// and http://discuss.emberjs.com/t/changes-with-ds-restadapter/2406/8
App.ApplicationSerializer = DS.RESTSerializer.extend({
    normalize: function(type, hash, property) {
        var normalized = {}, normalizedProp;

        for (var prop in hash) {
            if (prop.substr(-3) === '_id') {
                // belongsTo relationships
                normalizedProp = prop.slice(0, -3);
            } else if (prop.substr(-4) === '_ids') {
                // hasMany relationship
                normalizedProp = Ember.String.pluralize(prop.slice(0, -4));
            } else {
                // regualarAttribute
                normalizedProp = prop;
            }

            normalizedProp = Ember.String.camelize(normalizedProp);
            normalized[normalizedProp] = hash[prop];
        }

        return this._super(type, normalized, property);
    },
    serialize: function(record, options) {
        json = {}

        record.eachAttribute(function(name) {
            json[name.underscore()] = record.get(name)
        })

        record.eachRelationship(function(name, relationship) {
            if (relationship.kind == 'hasMany') {
                key = name.singularize().underscore() + '_ids'
                json[key] = record.get(name).mapBy('id')
            } else {
                key = name.underscore() + '_id'
                json[key] = record.get(name + '.id')
            }
        });

        if (options && options.includeId) {
            json.id = record.get('id') 
        }

        return json
    },
    typeForRoot: function(root) {
        var camelized = Ember.String.camelize(root);
        return Ember.String.singularize(camelized);
    },
    serializeIntoHash: function(data, type, record, options) {
        var root = Ember.String.decamelize(type.typeKey);
        data[root] = this.serialize(record, options);
    },
    serializeAttribute: function(record, json, key, attribute) {
        var attrs = Ember.get(this, 'attrs');
        var value = Ember.get(record, key), type = attribute.type;

        if (type) {
          var transform = this.transformFor(type);
          value = transform.serialize(value);
        }

        // if provided, use the mapping provided by `attrs` in
        // the serializer
        key = attrs && attrs[key] || Ember.String.decamelize(key);

        json[key] = value;
    }
});

これが役立つことを願っています。

于 2013-10-06T11:21:08.723 に答える
4

を使用します(ここでActiveModelAdapterPR を参照してください):

App.ApplicationAdapter = DS.ActiveModelAdapter.extend();
于 2013-10-06T13:08:46.363 に答える