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

时间:2018-08-20 22:38:27

标签: ruby-on-rails amazon-s3 rails-activestorage

有人创建过一个表单,用户可以通过单击按钮从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 :(得分:0)

set_space正在寻找 Space 对象的ID

delete_image_attachment的调用传递了image.signed_id,为{strong> SpaceImage 对象的id,而不是为 Space的id 对象。

假设已经在 Space SpaceImage 类上以标准方式设置了导航,则可以从图像对象中找到空间对象。因此,进行这些更改...

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。