Этот вопрос, вероятно, кажется наивным, но, пожалуйста, не поддавайтесь склонности думать, что это так, на мгновение. Я год пытался найти ситуацию, которая не была бы болезненной и безобразной. Я соединил что-то, что работает и понятно. Но это определенно не просто. Пожалуйста, скажите мне, что есть более простая настройка формата данных.
Этот файл (ниже) несколько отражает мой текущий подход. В основном потоки данных выглядят так:
- rails отправляет данные через
fast-jsonapi
- , реагирует, нормализует это через
json-api-normalizer
- , реагирует, использует
redux-object
для преобразования нормализованного данные в объекты, которые можно просматривать (для целей чтения) - данные json анализируются вручную и хранятся отдельно в виде данных формы в формате вложенных атрибутов Rails (с
_attributes
и _destroy
et c) который отправляется обратно в rails, когда придет время - реагирует, приложение обрабатывает данные формы и отправляет в Rails
- Rails возвращает
jsonapi
в качестве ответа, и процесс повторяется сверху .
Важно, чтобы я мог иметь произвольную глубину ассоциации, иметь возможность получать ошибки и отображать ошибки с помощью проверок Rails, создавать новые объекты и уничтожать объекты. Единственный способ, которым я знаю, как это сделать - это использовать вложенные атрибуты / ассоциации Rails.
import normalize from 'json-api-normalizer'
import build_redux_objects from 'redux-object'
import FormData from 'library/utils/form_data'
export default class Hydrator {
constructor(json) {
if (!json) return
this.json = json
this.build()
this.buildFormData()
}
build = () => {
this.normalizedData = normalize(this.json, { camelizeKeys: false, camelizeTypeValues: false } )
this.person = build_redux_objects(this.normalizedData, 'person')[0]
}
buildFormData = () => {
let p = this.person
this.formData = {
company_selected_options: this.companySelectedOptions(),
person: {
first_name: p.first_name,
last_name: p.last_name,
www: p.www,
role: p.role,
title: p.title,
mar_status: p.mar_status,
sex: p.sex,
slug: p.slug,
bio: p.bio,
short_bio: p.short_bio,
birth: p.birth,
vip: p.vip,
is_notify: p.is_notify,
is_office_staff: p.is_office_staff,
is_wt_leader: p.is_wt_leader,
error_messages: p.error_messages,
company_ids: p.companies.map( c => c.id),
email_addresses_attributes: p.email_addresses.map( obj => FormData.objectFor('EmailAddress', obj) ),
phones_attributes: p.phones.map ( obj => FormData.objectFor('Phone', obj) ),
addresses_attributes: p.addresses.map ( obj => FormData.objectFor('Address', obj) ),
notes_attributes: p.notes.map ( obj => FormData.objectFor('Note', obj) ),
passport_attributes: FormData.objectFor('Passport', p.passport),
}
}
}
}
Есть ли очевидный способ упростить это, с точки зрения форматов данных или библиотек, или подход, который все еще отвечает базовым c потребностям CRUD?
Что бы я хотел больше всего это не должно иметь так много форматов данных. Если бы я мог посылать с рельсов формат, который реагировал бы, мог манипулировать напрямую и отправлять обратно без преобразования, это было бы удивительно.