2

次の問題があります。

私のアプリでは、新しい を作成する画面がありますSite。しかしaction、コントローラーの を介して新しいサイトを保存すると、languages-property はPOST-request と共にサーバーに送信されません。

新しいサイトを追加するためのテンプレートは次のとおりです。

<form class="form-horizontal">
<div class="control-group">
    <label class="control-label" for="name">Name</label>
    <div class="controls">
        {{view Ember.TextField valueBinding="name"}}
    </div>
</div>
<div class="control-group">
    <label class="control-label" for="languages">Languages</label>
    <div class="controls">
        {{view Ember.Select contentBinding="controllers.languages" selectionBinding="languages" optionValuePath="content.id" optionLabelPath="content.description" multiple="true"}}
            </div>
</div>
<div class="form-actions">
    <button {{ action "createSite" }} class="btn btn-primary">Save</button>
</div>

私は自分を次のStoreように定義しました:

App.Store = DS.Store.extend({
    revision : 12,
    adapter : DS.RESTAdapter.extend({
        namespace : 'rest'
    })
});

これは私のコントローラーです:

App.SitesNewController = Em.ObjectController.extend({
    needs: ['languages'],
    name: null,
    languages: null,
    createSite : function() {
        var self = this;
        var name = this.get('name');
        var languages = this.get('languages');
        // Create the new Site model
        var s = App.Site.createRecord({
            name : name
        });
        $.each(languages,function(i,lang) {
            s.get('languages').addObject(lang);
        });

        this.get('store').commit();
    }
});

これがSiteモデルです

App.Site = DS.Model.extend({
    name : DS.attr('string'),
    languages : DS.hasMany('App.Language')
});

Language-モデル:

App.Language = DS.Model.extend({
    description : DS.attr('string')
});

サーバーに送信されたPOST-request データは次のとおりです。

{
  "site":{"name":"test"}
}

だから私は - プロパティが恋しいlanguageです。実際には、language_idsID の配列を持つプロパティが必要です。

RESTAdapter-configuration を次のように編集すると:

DS.RESTAdapter.map('App.Site', {
    languages: { embedded: 'always' }
});

-requestPOSTデータは次のとおりです。

{
  "site": {
    "name":"test",
    "languages":[{
      "id":2,"description":"English"
    },{
      "id":3,"description":"Deutsch"
    }]
  }
}

言語は、リクエスト データに埋め込まれています。これは問題ありません。バックエンドでid保存する前に取得します。languageただし、データが GET 応答にも埋め込まれていることを期待していることを知っておいてください。

idPOST データで 'sだけを送信する方法は何ですか? 私はそれを次のようにしたい:

{
  "site": {
    "name":"test",
    "languages":[2,3]
  }
}
4

1 に答える 1

6

この回答は、主にこの他の StackOverflow 回答から派生しています。

App.Store = DS.Store.extend({
    revision : 12,
    adapter : DS.RESTAdapter.extend({
        namespace : 'rest',
        serializer: DS.RESTSerializer.extend({
            addHasMany: function (hash, record, key, relationship) {
                var type = record.constructor,
                    name = relationship.key,
                    serializedHasMany = [], 
                    manyArray, embeddedType;

                embeddedType = this.embeddedType(type, name);
                if (embeddedType !== 'always') { return; }

                manyArray = record.get(name);

                manyArray.forEach(function (record) {
                    serializedHasMany.push(record.get('id'));
                }, this);

                hash[this.singularize(key) + '_ids'] = serializedHasMany;
            }

        })

    })
});

参考までにJSONSerializerRESTSerializerがほとんど継承している を確認してください。何をするかのコードはaddHasManyここにあります

上記のスニペットで、実際に異なるのは最後の数行だけであることに注意してください。埋め込まれたレコードをシリアル化するのではなく、ID は単一化されたキーの下のハッシュにプッシュされます (埋め込み型の独自のチェックがRESTSerializer#keyForHasManyなければ使用していたでしょう。

于 2013-03-29T19:17:02.380 に答える