首页 文章

Active Storage清除方法为NilClass抛出未定义的方法signed_id

提问于
浏览
1

我有一个问题类似于这里的问题,但丢弃数据库不是我的项目的可行解决方案:Rails 5.2 ActiveStorage undefined method `signed_id' for nil:NilClass

我有一个表单,允许上传新图像并删除已通过单击链接上传的图像 . 该表单使用Ruby on Rails Active Storage和S3 . 我按照答案here创建了用户可以单击以删除图像的链接 . 我认为它正在删除图像 . 但是,当页面重新加载时,我收到此错误

错误:'t resolve image into URL: undefined method `signed_id'可以为nil:NilClass

单击“删除”链接后,页面应重新加载并显示剩余的图像 . 我该如何解决这个错误?

Here is the model

class Space < ApplicationRecord
  belongs_to :user

  has_many_attached :space_image

end

The controller

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


  def delete_image_attachment
    @space_image = ActiveStorage::Blob.find_signed(params[:id])
    @space_image.purge_later
    redirect_back(fallback_location: spaces_path)
  end


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

The view

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

服务器错误输出

ActionView::Template::Error (Can't resolve image into URL: undefined method `signed_id' for nil:NilClass):
    1: <div>
    2:   <% if @space.space_image.attached? %>
    3:     <% @space.space_image.each do |space_image| %>
    4:     <%= image_tag space_image, class: "avatar-medium" %>
    5:     <%= link_to 'Remove', delete_image_attachment_space_url(space_image.signed_id),
    6:                 method: :delete,
    7:                   data: { confirm: 'Are you sure?' } %>

app/views/spaces/_spaceimg.html.erb:4:in `block in _app_views_spaces__spaceimg_html_erb___4211978368865358240_70218939472720'
app/views/spaces/_spaceimg.html.erb:3:in `_app_views_spaces__spaceimg_html_erb___4211978368865358240_70218939472720'
app/views/spaces/listing.html.erb:121:in `block in _app_views_spaces_listing_html_erb__2591928334825339114_70218934956920'
app/views/spaces/listing.html.erb:15:in `_app_views_spaces_listing_html_erb__2591928334825339114_70218934956920'

1 回答

  • 1

    发生这种情况是因为您直接从ActiveStorage::Blob删除了记录,这样就破坏了一致性 .

    相反,您必须在ActiveStorage::Attachment中找到相关记录,然后将其删除:请参阅this line .


    Edit: 如何删除附件的一个示例 .

    在控制台中测试过,所以可能需要修复一些语法 .

    space_image.id 应返回ActiveStorage :: Attachment中记录的id,因此将其传递给控制器:

    delete_image_attachment_space_url(space_image.id)
    

    然后在控制器中,找到记录并应用删除它所需的方法:

    def delete_image_attachment
        @space_image = ActiveStorage::Attachment.find(params[:id])
        @space_image.purge
        # whatever
      end
    

相关问题