2016-03-01 5 views
0

У меня есть модель под названием «Членство», которая имеет строковый атрибут «inviteToken», который я хотел бы использовать в качестве основного ключа.Как переопределить первичный ключ с атрибутом API JSON

Я создал следующий сериализатор, но не могу получить его для получения первичного ключа от JSON.

приложение/сериализаторов/membership.js:

import DS from 'ember-data'; 

export default DS.JSONAPISerializer.extend({ 
    primaryKey: 'invite-token' // also tried 'inviteToken' 
}); 

Специфическая ошибка, я получаю:

Error while processing route: invitations.show Assertion Failed: You must include an 'id' for membership in an object passed to 'push'
Error: Assertion Failed: You must include an 'id' for membership in an object passed to 'push'

Что происходит, когда я пытаюсь получить запись по идентификатору в маршруте :

import Ember from 'ember'; 

export default Ember.Route.extend({ 
    model(params) { 
    return this.store.find('membership', params.token); 
    } 
}); 

API Ответ:

{ 
    "jsonapi":{ 
    "version":"1.0" 
    }, 
    "data":{ 
    "type":"membership", 
    "id":"30", 
    "attributes":{ 
     "invite-token":"5bGo7IhZh93E4SB07VWauw" 
    } 
    } 
} 

Странно то, что если я использую «тип» в качестве первичного ключа, я вижу «членство» в качестве идентификатора в инспекторе. Это как если бы данные ember не знали, как использовать что-то из «атрибутов». Я использую данные ember 2.4.0.

Update

Я могу взломать эту работу в моем сериализаторе, делая это:

import DS from 'ember-data'; 

export default DS.JSONAPISerializer.extend({ 
    normalize: function(type, hash) { 
    const json = this._super(type, hash); 
    json.data.id = json.data.attributes.inviteToken; 

    return json; 
    } 
}); 
+0

Когда вы получаете эти ошибки? Какой конкретный код, который имеет отношение к 'store', вызывает это? –

+0

@ DanielKmak Я добавил код маршрута и сериализатор, который делает то, что мне нужно. –

ответ

3

сериализатора ожидает значение primaryKey сослаться на элемент верхнего уровня в формате JSON. Вот почему работают «тип» и «id». В настоящее время он не поддерживает вложенные свойства (например, PrimaryKey: «attributes.invite-маркер»)

Однако есть две хорошие обходные:

Первый Переопределение метода extractId. default implementation довольно прост. В вашем случае вы могли бы сделать что-то вроде:

extractId(modelClass, resourceHash) { 
    var id = resourceHash['attributes']['invite-key'; 
    return coerceId(id); 
    }, 

Второй способ является метод, который вы обнаружили, более грубый подход, и это присвоить идентификатор вручную в функции нормализуют.

Смежные вопросы