ruby-on-rails 在Rails6中更新带有has_many_attached的映像的正确方法是什么

qq24tv8q  于 2023-04-08  发布在  Ruby
关注(0)|答案(3)|浏览(128)

我有一个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
yrwegjxp

yrwegjxp1#

这是我现在的解决方案:
将以下内容添加到更新操作:

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

2jcobegt2#

由于Rails 6.0默认会替换任何现有的附件,所以会发生这种情况,因为赋值给用has_many_attached声明的附件。
详细信息:

  • 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
应用程序重新启动后,以前添加的附件将不会被替换。

a14dhokn

a14dhokn3#

尝试选择多个文件,如https://i.stack.imgur.com/EqaU7.png如果它工作,那么你将需要选择所有以前的图像,而上传新的一个,这听起来不好。

相关问题