• Project 有很多 Tasks .

  • 每个 Task 都可以使用ActiveStorage上传图像 .

在我的Project new视图中,我动态创建了嵌套表单(通过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

我可以访问params中的单个图像:

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

一种方法是循环遍历每个 @project.tasks 并使用相同顺序的上述参数中的图像调用 .attach . 但这似乎很容易出错,因为params并不总是将图像附加到正确的任务中 . 如果由于无效而某些任务没有保存到db,则1对1的匹配会导致这种方法更加脆弱 .

有没有更好的办法?

Edit

出于某种原因,它现在正在运作 . 我不知道我是否改变了某些东西,或者它是原始代码......