在 Rails 中使用 has_many_attached 更新图像的正确方法是什么 6
What is the correct way to update images with has_many_attached in Rails 6
我有一个 Rails 6 应用程序,它使用 Active Storage 将多个图像存储到模型 (Activity) 中 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
像这样尝试 select 处理多个文件 https://i.stack.imgur.com/EqaU7.png
如果有效,那么您将需要 select 所有以前的图像,同时上传听起来不太好的新图像。您可能喜欢使用嵌套形式。
这是我现在的解决方案:
将此添加到更新操作:
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:[]
我有一个 Rails 6 应用程序,它使用 Active Storage 将多个图像存储到模型 (Activity) 中 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
像这样尝试 select 处理多个文件 https://i.stack.imgur.com/EqaU7.png 如果有效,那么您将需要 select 所有以前的图像,同时上传听起来不太好的新图像。您可能喜欢使用嵌套形式。
这是我现在的解决方案:
将此添加到更新操作:
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:[]