Я думал, что внесу свой вклад в сообщество, рассказав, как я решил эту проблему.
Подводя итог, можно сказать, что основная проблема заключалась в согласовании поведения CarrierWave, вложенных форм и точного контроля загрузки файлов.
Суть проблемы заключалась в том, что вложенные формы создают корневую запись и все ее ассоциации в одной операции POST с действием #create корневого контроллера.
В приведенном выше примере модель записи была корневой, в то время как AudioFile, Note и Категоризация были ассоциациями, которые должны быть созданы вместе с записью.
Таким образом, с помощью Nested Forms мне пришлось бы создавать все эти записи в одном POST, что исключало бы возможность отмены отдельных загрузок или параллельной загрузки с добавлением других полей (например, Notes).
Это не помогло бы улучшить пользовательский опыт.Мое решение было очень простым:
- Я решил не использовать вложенные формы.
- Запись # create будет всегда вызываться с пустыми параметрами.Атрибуты записи будут получать разумные значения по умолчанию в операции создания.
- Пользователь будет видеть только страницу редактирования # записи.
- На странице редактирования # записи у меня были независимые элементы управления для операций CRUD.на связанных моделях, которые будут маршрутизироваться на различные контроллеры через вызовы AJAX.Это работало, потому что каждая связанная модель имела действительный идентификатор записи для использования.
- Различные контроллеры возвращали бы фрагменты HTML, которые были бы записаны на главную страницу записи.
Это позволило встроенное редактирование всех полей на странице записи, даже если эти поля сопоставлены с различными (связанными) моделями.Таким образом, пользователь сможет загружать несколько файлов, добавлять заметки во время загрузки, воспроизводить уже загруженные файлы и отменять загрузки по желанию.
В результате весь пользовательский опыт стал намного более плавным.Это никогда не было бы достижимо с помощью вложенных форм по определению.