Как запретить сохранение 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