Внедрить отношения в Ember Payload - PullRequest
0 голосов
/ 29 августа 2018

У меня есть компонент, который показывает и создает комментарии для поста, этот компонент имеет форму для создания новых комментариев и отправляет их через POST на сервер, нормальная полезная нагрузка будет:

{
  data: {
    attributes: {
      created_at: "foo",
      autor: "foo",
      text: "foo"
    },
    relationships: {
      post: {
        data: { type: "posts", id: 1234 },
        id: "1234",
        type: "loans"
      }
    },
    type: "comment"
  }
}

Проблема возникает, когда вам нужно использовать компонент в другом представлении и, что более важно, когда имя модели отличается, скажем, posts_breakdown, в этом случае полезная нагрузка будет:

    { data: {
        attributes: {
          created_at: "foo",
          autor: "foo",
          text: "foo"
        },
        relationships: {
          post: {
            data: null
          }
        },
        type: "comment"
      }
    }

Понятно, что в комментариях нет никакого отношения posts_breakdown, первое, что я пытался добавить это отношение к модели с posts_breakdown: belongsTo (posts_breakdown).

Проблема в том, что бэкэнд не может его распознать и не может его изменить. Бэкэнд принимает значения в связях, чтобы связать комментарий с постом (поле post_id в таблицу комментариев)

My question: Есть ли какой-нибудь способ «обмануть» бэкэнд и / или изменить полезную нагрузку, поэтому подумайте, что модель post_breakdown опубликована?

Ниже показано, как у меня есть определенные модели:

comment.js:

    export default DS.Model.extend ({
        author: DS.attr (),
        text: DS.attr (),
        created_at: DS.attr (),
        post: DS.belongsTo ('post'),
        posts_breakdown: DS.belongsTo ('posts_breakdown'),
    });

posts.js:

    export default DS.Model.extend ({
        text: DS.attr (),
        created_at: DS.attr (),
        author: DS.attr (),
        comments: DS.hasMany ('comments'),
    });

post_breakdown.js

    export default DS.Model.extend ({
        most_commented_post: DS.attr (),
        last_commented_post: DS.attr (),
        frequent_users: DS.attr (),
        comments: DS.hasMany ('comments'),
    });

1 Ответ

0 голосов
/ 29 августа 2018

Хорошо, я уже выяснил, как изменить полезную нагрузку и отправить ее на сервер. У Ember есть сериализаторы!

Следуя этому руководству, я могу изменить данные в полезную нагрузку, стереть их, добавить их или все, что мне нужно:

https://guides.emberjs.com/release/models/customizing-serializers/

В моем случае, сначала мне нужно добавить отношение в модель комментария в этой строке:

`posts_breakdown: DS.belongsTo ('posts_breakdown')`

затем сгенерируйте сериализатор для модели комментария с помощью ember-cli:

`ember generate serializer comment`

наконец, в сериализатор, если полезная нагрузка содержит данные в отношении post_breakdown, удалите их и передайте их в отношение post, таким образом, полезная нагрузка была такой же:

import DS from 'ember-data';

export default DS.JSONAPISerializer.extend({
  /*
  This two functions, are necesary because Ember Data changes the underscore
  between variable names by dashes. In fact, it's a Ember suggestion.
  */
  keyForAttribute: function (key) {
    return key;
  },

  keyForRelationship: function (key) {
    return key;
  },

  serialize(snapshot, options) {
    let json = this._super(...arguments);
    /* This makes possible to store comments when the comments-panel-loan component is used
    in loan_breakdown view with post_breakdown model:
    */
    if (json.data.relationships.post_breakdown.data) {
      json.data.relationships.loan = {
        data: {
          type: "posts",
          id: json.data.relationships.post_breakdown.data.id }
      };
      delete json.data.relationships.post_breakdown;
    }
    return json;
  },
});
...