Как предотвратить сохранение данных Ember Data (т.е. Атрибут только для чтения)
Я создаю он-лайн построитель форм, используя Ember 2.0 на front-end и Rails 4.2 в фоновом режиме с помощью json_api_resources gem.
В процессе публикации формы пользователь должен иметь возможность вырезать/вставить фрагмент кода на свою веб-страницу, чтобы "ajax в" форме, которую они настроили.
Таким образом, атрибут 'embed-snippet' модели Form должен быть доступен только для чтения. Я не хочу, чтобы содержимое поля фрагмента было отправлено обратно на сервер, когда пользователь внесет изменения в форму и сохранит запись.
Некоторые подходы, которые я рассмотрел:
- Изменение сериализатора, чтобы проверить этот специфический атрибут и удалить его из полезной нагрузки перед отправкой его в фоновый сервер
- Преобразование поля "embed-snippet" в отдельную модель с отношением к модели формы и последующее ее исключение из сохранения
- Создание нового атрибута данных Ember Datali >
В идеале был бы лучший способ справиться с этой проблемой.
Что-то вроде:
'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