首页 文章

单击链接以删除Active Storage和Amazon S3上的附件

提问于
浏览
0

是否有人创建了一个表单,用户可以通过单击按钮从Active Storage和Amazon S3中删除以前上载的图像?我使用问题here作为指南,但我的应用程序设置有点不同 . 图像保存为数组(参见控制器参数) .

表单呈现删除按钮和图像,但是当单击删除按钮时,我收到错误“无法找到空格'id'= eyJfcmFpbHM ...”并且我的set_space方法中的这一行被突出显示

@space = Space.find(params[:id])

这是相关的代码

控制器

class SpacesController < ApplicationController
  before_action :set_space, except: [:index, :new, :create]
  before_action :authenticate_user!, except: [:show]


  def update
    if @space.update(space_params)
      flash[:notice] = "Saved!"
    else
      flash[:notice] = "Something went wrong. Please check your submission and try again."
    end
      redirect_back(fallback_location: request.referer)
  end


  def delete_image_attachment
    @space_image = ActiveStorage::Blob.find_signed(params[:id])
    @space_image.purge_later
    redirect_to listing_space_path(@space)
  end

  private
    def set_space
      @space = Space.find(params[:id])
    end

    def space_params
        params.require(:space).permit(:space_name, :space_type, :description, space_image: [])
    end

end

带删除按钮/图标的视图

<div>
  <% if @space.image.attached? %>
      <% @space.image.each do |image| %>
      <%= image_tag image %>
      <span>
        <%= link_to '<- Remove', delete_image_attachment_space_url(image.signed_id),
                method: :delete,
                data: { confirm: 'Are you sure?' } %>
        <i class="fas fa-trash"></i>
      </span>
    <% end %>
  <% end %>
</div>

的routes.rb

resources :spaces, except: [:edit] do
  member do
    get 'listing'
    delete :delete_image_attachment
  end
end

1 回答

  • 0

    set_space 正在寻找 Space 对象的id

    delete_image_attachment 的调用是 image.signed_idSpaceImage 对象的 id ,而不是 Space 对象的 id .

    假设已在 SpaceSpaceImage 类上以标准方式设置导航,则可以从图像对象中找到空间对象 . 所以做出这些改变......

    before_action :set_space, except: [:index, :new, :create, :delete_image_attachment]

    def delete_image_attachment
      @space_image = ActiveStorage::Blob.find_signed(params[:id])
      @space_image.purge_later
      redirect_to listing_space_path(@space_image.space)
    end
    

    这会将适当的空间ID传递给listing_space_path .

相关问题