Какие форматы данных использовать в и из Rails с React? - PullRequest
0 голосов
/ 12 марта 2020

Этот вопрос, вероятно, кажется наивным, но, пожалуйста, не поддавайтесь склонности думать, что это так, на мгновение. Я год пытался найти ситуацию, которая не была бы болезненной и безобразной. Я соединил что-то, что работает и понятно. Но это определенно не просто. Пожалуйста, скажите мне, что есть более простая настройка формата данных.

Этот файл (ниже) несколько отражает мой текущий подход. В основном потоки данных выглядят так:

  • 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?

Что бы я хотел больше всего это не должно иметь так много форматов данных. Если бы я мог посылать с рельсов формат, который реагировал бы, мог манипулировать напрямую и отправлять обратно без преобразования, это было бы удивительно.

...