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 并且可能需要一个更好的名称,但它应该演示这个概念。
我有一个 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 withconfig.active_storage.replace_on_assign_to_many
set totrue
before upgrading. To append new attachables to the Active Storage association, prefer usingattach
. 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 并且可能需要一个更好的名称,但它应该演示这个概念。