Rails 活动存储 - 保留现有文件/上传?

Rails Active Storage - Keep Existing Files / Uploads?

我有一个 Rails 模型:

has_many_attached :files

默认情况下通过 Active Storage 上传时,如果您上传新文件,它会删除所有现有上传文件并用新文件替换它们。

我有一个控制器破解,由于很多原因不太理想:

有没有办法配置 Active Storage 以保留现有的?

看起来有一个 configuration 可以做到这一点

config.active_storage.replace_on_assign_to_many = false

不幸的是,根据当前 rails 源代码,它已被弃用,它将是 removed in Rails 7.1

config.active_storage.replace_on_assign_to_many is deprecated and will be removed in Rails 7.1. Make sure that your code works well with config.active_storage.replace_on_assign_to_many set to true before upgrading. To append new attachables to the Active Storage association, prefer using attach. Using association setter would result in purging the existing attached attachments and replacing them with new ones.

看来明确使用 attach 将是唯一的出路。

所以一种方法是在控制器中设置所有内容:

def update
  ...
  if model.update(model_params)
    model.files.attach(params[:model][:files]) if params.dig(:model, :files).present?
  else
    ...
  end
end

如果您不喜欢在控制器中使用此代码。例如,您可以覆盖模型的默认值 setter,例如:

class Model < ApplicationModel
  has_many_attached :files

  def files=(attachables)
    files.attach(attachables)
  end
end

不确定我是否会推荐此解决方案。我更愿意为附加文件添加新方法:

class Model < ApplicationModel
  has_many_attached :files

  def append_files=(attachables)
    files.attach(attachables)
  end
end

并在您的表单中使用

  <%= f.file_field :append_files %>

它可能还需要模型中的 reader 并且可能需要一个更好的名称,但它应该演示这个概念。