Rails rails7.1 以后版本,使用 activestorage 在 update 对象过程中,追加附件而不删除已有附件的方法

y9info · 2024年12月23日 · 最后由 y9info 回复于 2024年12月24日 · 286 次阅读

问题:升级 rails7.1 后版本后,config.active_storage.replace_on_assign_to_many = true 来实现 active_storage 增加附件,而不是覆盖已有附件的方法已经被取消,新的解决方案是什么?

回答:在控制器中使用“attach”方法,大致思路是,从前端传过来的参数 hash 列表中,update 先剔除附件参数,对增加的附件参数,单独适用 attach 方法升级到附件列表中。参考代码如下:

模型:

class Post < ApplicationRecord
   has_many_attached :images
end

控制器 update 方法变更后:

def update
 respond_to do |format|
   if @post.update(post_params.reject { |k| k["images"] })
     if post_params[:images].present?
       post_params[:images].each do |image|
         @post.images.attach(image)
       end
     end
     format.html { redirect_to @post, notice: 'Post was successfully updated.' }
     format.json { render :show, status: :ok, location: @post }
   else
     format.html { render :edit }
     format.json { render json: @post.errors, status: :unprocessable_entity }
   end
 end
end

还有 rails 指南中提到的简便方法:

3.4 替换与添加附件

在 Rails 中,默认情况下,将文件附加到 has_many_attached 关联将替换任何现有的附件。 要保留现有附件,可以使用带有每个附加文件的 signed_id 的隐藏表单字段:

<% @post.images.each do |image| %>
  <%= form.hidden_field :images, multiple: true, value: image.signed_id %>
<% end %>

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

这具有使您能够选择性地删除现有附件的优点,例如使用 JavaScript 删除各个隐藏字段。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号