在 Rails 6 中使用 has_many_attached 更新图像的正确方法是什么?



我有一个Rails 6应用程序,它使用Active Storage将多个图像存储到具有has_many_attached的模型(Activity(中。

我不明白如何附加额外的图像而不是替换现有图像。当我第一次上传图像时,它们会正确保存。但是,当我更新记录并添加新图像时,以前的图像将被新图像替换。在 Rails 5 中,将附加新图像,而不替换以前保存的图像。

如何附加新图像而不是替换以前的图像?

我有一个活动模型,其中包含以下内容:

has_many_attached :images

在我有的形式中:

<%= f.file_field :images, multiple: true %>

在控制器中,我有以下内容:

def update
@activity = Activity.find(params[:id])
if @activity.update(activity_params)
flash[:success] = "Saved"
redirect_to activity_path(@activity)
else
flash[:error] = "Not saved"
redirect_to edit_activity_path(@activity)
end
end
private
def activity_params
params.require(:activity).permit(:name, images:[])
end

这是我现在的解决方案:

将此添加到更新操作中:

if params[:activity][:images].present?
params[:activity][:images].each do |image|
activity.images.attach(image)
end

因此,整个更新操作如下所示:

def update
if activity.update(activity_params)
if params[:activity][:images].present?
params[:activity][:images].each do |image|
activity.images.attach(image)
end
end
flash[:success] = 'Updated!'
respond_with activity, location: activity_path(activity)
else
flash[:error] = 'Not updated'
respond_with activity, location: activity_path(activity)
end
end

并从允许的参数中删除它:

images:[]

发生这种情况会导致分配给用has_many_attached声明的附件,因为默认情况下Rails 6.0会替换任何现有的附件。

详:

  • https://guides.rubyonrails.org/configuring.html#default-values-for-target-version-6-0
  • https://edgeguides.rubyonrails.org/6_0_release_notes.html#active-storage-notable-changes

因此,在 Rails 6.0+ 中,您需要将这一行添加到您的环境配置中(config/environments/development.rb等(:
config.active_storage.replace_on_assign_to_many = false
应用程序重新启动后,以前添加的附件不会被替换。

尝试选择多个文件,如下所示 https://i.stack.imgur.com/EqaU7.png 如果它有效,那么您将需要选择所有以前的图像,同时上传听起来不好的新图像。您可能喜欢使用嵌套表单。

相关内容

  • 没有找到相关文章

最新更新