Как загрузить файл во вложенной форме с помощью ActiveStorage? - PullRequest
0 голосов
/ 18 сентября 2018
  • У меня есть Project, у которого много Tasks.
  • Каждый Task может иметь изображение, загруженное с помощью ActiveStorage.

В моем новом представлении Project я динамически создавал вложенные формы (через Cocoon) для создания новых задач и file_field для загрузки изображения для каждой задачи. Когда форма отправлена, я создаю новый проект вместе с новыми задачами из project_params в моем контроллере проекта. Но как я могу использовать ActiveStorage, чтобы прикрепить изображение каждой задачи после создания проекта?

class Project < ApplicationRecord
  has_many :tasks
end

class Task < ApplicationRecord
  belongs_to :project
end

Вид вложенной формы

<%= form_for @project do |f| %>
    <%= f.fields_for :tasks do |ff| %>
        <%= ff.file_field :image %>
    <% end %>
<% end %>

Контроллер проекта

class ProjectController
  def create
    @project = Project.new(project_params)
    @project.save
    ...
    # How should I attach task images here?
  end
end

Я могу получить доступ к отдельным изображениям в параметрах:

"tasks_attributes": {
  "0": { "image": ... },
  "1": { "image": ... }
}

Один из способов - циклически проходить через каждый @project.tasks и вызывать .attach на них с изображением из приведенных выше параметров в том же порядке. Но это кажется ошибочным, так как params не дает мне идентификатор задачи, чтобы соответствовать сохраненной задаче, поэтому я волнуюсь, я не всегда буду прикреплять изображение к правильной задаче. Если некоторые задачи не были сохранены в БД из-за того, что они недействительны, сопоставление 1-к-1 нарушается, что делает этот подход еще более хрупким.

Есть ли лучший способ?

Редактировать

Почему-то сейчас работает. Я не мог сказать, изменил ли я что-то или это оригинальный код ...

...