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

问题描述 投票:0回答:3

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

has_many_attached

我不明白如何附加额外的图像而不是替换现有图像。当我第一次上传图片时,它们会正确保存。但是,当我更新记录并添加新图像时,以前的图像会被新图像替换。在 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
ruby-on-rails rails-activestorage ruby-on-rails-6
3个回答
17
投票

这是我现在的解决方案:

将此添加到更新操作:

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:[]

0
投票

发生这种情况是因为分配给用

has_many_attached
声明的附件,因为默认情况下 Rails 6.0 会替换任何现有附件。

详情:

因此,在 Rails 6.0+ 中,您需要将此行添加到您的环境配置中(

config/environments/development.rb
等):
config.active_storage.replace_on_assign_to_many = false

应用重启后,之前添加的附件将不会被替换。


-5
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.