Вложения в непостоянную запись в Rails - PullRequest
0 голосов
/ 22 апреля 2019

Итак, у меня есть страница items/new.html.erb, в которой есть форма для новой записи Items.

Теперь на странице есть также раздел загрузки изображений, помимо новой формы записи, где пользователь может загрузить несколько изображений. Этот дизайн пользовательского интерфейса предполагает, что пользователь должен иметь возможность загружать изображения или прикреплять изображения к создаваемой записи.

Моя текущая настройка - когда пользователь загружает изображение на странице (это обрабатывается через AJAX / rails UJS), id загруженного изображения / изображений будет добавлено в скрытое поле в новом Item форма. Только тогда, когда будет отправлена ​​основная форма, изображения будут прикреплены к вновь созданному ресурсу Item. Я чувствую, что это необычный способ решения этой проблемы и что для этого есть более простой и понятный способ Rails.

Я называю изображения так:

item.images

Страница также позволяет пользователю иметь возможность сортировать или обновлять порядок вложений изображений, но я думаю, что это тема, которая должна быть в другом обсуждении.

Как вы справляетесь с этой, первой проблемой, правильно и понятно в Rails?

1 Ответ

1 голос
/ 22 апреля 2019

Вложенные атрибуты

В Rails есть встроенный механизм, который называется accepts_nested_attributes.Что позволяет создавать вложенные записи в одном запросе:

class Item
  has_many :images
  accepts_nested_attributes_for :images
end

class Image
  belongs_to :item
  has_one_attached :file
end

Это позволит вам создать элемент и изображения с помощью:

Item.create(name: 'Foo', image_attributes: [{ file: 'foo.jpg'}, { file: 'bar.jpg'}])

ActiveRecord будет обрабатывать вставку записей в правильном порядке..

Это позволяет вам иметь необнуляемый внешний ключ (item_id) и избегать потерянных записей, что является очень реальной проблемой для вашего решения. Ссылочная целостность должно быть довольно высоко в вашем списке приоритетов.

Используется в модели вместе с fields_for в представлении (форме).

<%= form_with(model: @item) do |form| %>
  <%= form.fields_for(:images) do |image_fields| %>
    <%= image_fields.file_field :file %>
  <% end %>
<% end %>

И передавая массив ключей в строгих параметрах:

params.require(:item).permit(:name, image_attributes: [:file])

ActiveStorage has_many_attached

ActiveStorage также позволяет вам установить связь один ко многим безмодель с помощью has_many_attached.Вложения хранятся в таблице active_storage_attachments.Однако, насколько я знаю, нет способа прикрепить дополнительные метаданные (например, порядок) к вложениям.

...