【问题标题】:Click a link to remove an attachment on Active Storage & Amazon S3单击链接以删除 Active Storage 和 Amazon S3 上的附件
【发布时间】:2019-01-27 02:13:40
【问题描述】:

是否有人创建了一个表单,用户可以通过单击按钮从 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

【问题讨论】:

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


    【解决方案1】:

    set_space 正在寻找 Space 对象的 id

    delete_image_attachment 的调用传递的是image.signed_idid 用于SpaceImage 对象,而不是id 用于Space 对象。 p>

    假设导航已在 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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-24
      • 1970-01-01
      • 2019-11-01
      • 1970-01-01
      • 2020-04-05
      • 1970-01-01
      • 1970-01-01
      • 2021-04-24
      相关资源
      最近更新 更多