- У меня есть
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 нарушается, что делает этот подход еще более хрупким.
Есть ли лучший способ?
Редактировать
Почему-то сейчас работает. Я не мог сказать, изменил ли я что-то или это оригинальный код ...