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

Я создаю он-лайн построитель форм, используя Ember 2.0 на front-end и Rails 4.2 в фоновом режиме с помощью json_api_resources gem.

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

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

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

  • Изменение сериализатора, чтобы проверить этот специфический атрибут и удалить его из полезной нагрузки перед отправкой его в фоновый сервер
  • Преобразование поля "embed-snippet" в отдельную модель с отношением к модели формы и последующее ее исключение из сохранения
  • Создание нового атрибута данных Ember Data​​li >

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

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

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

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

Ответ 1

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

(in 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);
  },
});

Ответ 2

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

В app/serializers/form.js:

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

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

Ответ 3

Вы также можете управлять этим из бэкэнд, используя 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

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


UPDATE

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

def self.updatable_fields(context)
  super - [:whatever]
end