【问题标题】:What is the correct way to update images with has_many_attached in Rails 6在 Rails 6 中使用 has_many_attached 更新图像的正确方法是什么
【发布时间】:2020-01-18 19:13:42
【问题描述】:

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

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

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

我有一个具有以下内容的 Activity 模型:

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


【解决方案1】:

这是我现在的解决方案:

将此添加到更新操作中:

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

【讨论】:

  • 如何设置创建动作?
  • 只是补充一点信息,如果你把params[:activity][:images]改成activity_params[:images] 就不行了
  • 聚会有点晚了,但假设您使用的是 Rails 6,这似乎是罪魁祸首:stackoverflow.com/questions/61933070/…
【解决方案2】:

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

【讨论】:

  • 这里的问题是:如何添加新图像而不是替换以前的图像?在 Rails 6 中,为给定记录更新多个图像的方式自 Rails 5 以来发生了变化。根据您的回答,您可能不熟悉这个问题。
猜你喜欢
  • 2015-06-03
  • 2021-08-16
  • 2020-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多