ruby-on-rails - 事件存储清除方法为 NilClass 抛出未定义的方法 signed_id

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

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

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

enter image description here
错误:无法将图像解析为 URL:nil:NilClass 的未定义方法“signed_id”

单击“删除”链接后,页面应重新加载并显示剩余图像。如何解决此错误?

这是型号

class Space < ApplicationRecord
  belongs_to :user

  has_many_attached :space_image

end

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

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'

最佳答案

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

相反,您必须在 ActiveStorage::Attachment 中找到相关记录。然后删除它:见this line .

编辑:如何删除附件的一个示例。

在控制台中测试,所以也许你需要修复一些语法。
space_image.id应该返回 ActiveStorage::Attachment 中记录的 id,因此将其传递给 Controller ​​:

delete_image_attachment_space_url(space_image.id)

然后在 Controller 中,只需找到记录并应用您需要删除它的方法:
  def delete_image_attachment
    @space_image = ActiveStorage::Attachment.find(params[:id])
    @space_image.purge
    # whatever
  end

关于ruby-on-rails - 事件存储清除方法为 NilClass 抛出未定义的方法 signed_id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52170764/

相关文章:

javascript - 使用 Javascript 上传到 Rails Active Storage

ruby-on-rails - 向关注点添加方法,但出现未定义的方法错误

jquery - 让 div 像复选框一样工作

ruby-on-rails - Rails ActiveStorage : how to avoid one redirect for each image?

ftp - 如何在亚马逊AWS上使用FTP

php - 慢速 S3 -> EC2 传输。错误代码?

ruby-on-rails - ActiveStorage::Current.host= 已弃用,我如何使用 ActiveStorage::Current.url_options

ruby-on-rails - RSpec Rails 找不到我的元标签

ruby-on-rails - Rails 3.1 中的 directions_extension 是什么?

amazon-web-services - S3 美国标准区域