Как запретить сохранение Ember Data (т. Е. Атрибут только для чтения)

Я создаю онлайн-конструктор форм, используя Ember 2.0 на внешнем интерфейсе и Rails 4.2 на внутреннем, с гемом json_api_resources.

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

Таким образом, атрибут 'embed-snippet' модели Form должен быть доступен только для чтения. Я не хочу, чтобы содержимое поля сниппета отправлялось обратно на сервер, когда пользователь вносит изменения в форму и повторно сохраняет запись.

Некоторые подходы, которые я рассмотрел:

  • Модификация сериализатора для проверки этого конкретного атрибута и удаления его из полезной нагрузки перед отправкой его на сервер
  • Преобразование поля 'embed-snippet' в отдельную модель с отношением к модели Form, а затем как-то исключив его из сохранения
  • Создание нового типа атрибута Ember Data

В идеале был бы лучший способ справиться с этой проблемой.

Что-то вроде:

'DS.attr('string', { readOnly: true })

Поэтому мой вопрос заключается в том, как лучше всего обеспечить, чтобы содержимое этого поля не отправлялось обратно на сервер?

3 ответа

Решение

Чтобы получить { readOnly: true } функциональность (которая облегчает добавление новых моделей / атрибутов), вы можете настроить serializeAttribute метод на JSONAPISerializer:

serializers/application.js):

import DS from 'ember-data';

export default DS.JSONAPISerializer.extend({
  serializeAttribute(snapshot, json, key, attribute) {
    // do not serialize the attribute!
    if (attribute.options && attribute.options.readOnly) {
      return;
    }
    this._super(...arguments);
  },
});

Самый простой способ сделать это - создать собственный сериализатор для модели формы и использовать attrs свойство, чтобы предотвратить сериализацию атрибута.

В app/serializers/form.js:

export default DS.JSONAPISerializer.extend({
    attrs: {
        embedSnippet: { serialize: false }
    }
});

Для получения дополнительной информации и примеров об атрибутах см. Документацию по API http://emberjs.com/api/data/classes/DS.JSONSerializer.html

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

def self.fetchable_fields(context)
  super - [
    :whatever_attribute_not_to_fetch_from_backend
  ]
end

def self.creatable_fields(context)
  super - [
    :embed_snippet,
    :another_attribute_not_accepted_from_post
  ]
end

Возможно, это не то, что вам нужно, поскольку это не помешает отправке атрибутов бэкэнду, а скорее предотвратит их принятие. Но это еще один вариант.


ОБНОВИТЬ

В зависимости от вашего варианта использования вам также может понадобиться:

def self.updatable_fields(context)
  super - [:whatever]
end
Другие вопросы по тегам