通过 API 调用从集合中删除单个 ActiveStorage 附件

Deleting a single ActiveStorage attachment out of a collection via an API call

编辑:TLDR:这归结为序列化附件。看我的回复。

我可以看到两种实现此目的的方法:

(1) 序列化附件(使用 idurl 属性),从而为 FE 提供一个 id,他们可以使用 DELETE /attachments/:id 这将然后调用 ActiveStorage::Attachment.find(:id).purge。问题在于序列化,因为附件没有内置模型。我尝试为 active_storage_attachments table 创建一个 ActiveStorageAttachment 模型,但无法获得附件的 url,因为 Rails.application.routes.url_helpers.url_for(@object) 需要一个 ActiveStorage::Attachment 对象不是 ActiveStorageAttachment 对象。

(2) 另一种选择是使用 DELETE /attachments/:attachment_url 端点。为此,我需要获取基于 url 的 ActiveStorage::Attachment 对象,以便对其调用 purge。不确定这是否可能?

我更喜欢第一个解决方案,感觉更干净、更灵活table。任何对这两种方法的帮助都将不胜感激!

最后,我设法使用 jsonapi-rb gem.

序列化附加图像(上面的选项 (1))

在控制器中,我 include: :images 并使用 expose 选项传入附件类型:

class PostsController < ApplicationController
...
  def show
    respond_to do |format|
      format.html
      format.json { render jsonapi: @post, include: :images, expose: {attachment_type: "images"} }
    end
  end
end

ActiveSupport 免费为您提供 post.images_attachments 方法:

class SerializablePost < JSONAPI::Serializable::Resource
  type 'posts'
  ...
  has_many :images do
    @object.images_attachments
  end
end

我创建了一个附件序列化程序:

class SerializableAttachment < JSONAPI::Serializable::Resource
  include Rails.application.routes.url_helpers

  type do
    @attachment_type
  end
  attribute :id
  attribute :url do 
    url_for(@object)
  end
end

我需要告诉 jsonapi 对所有附件使用这个序列化程序:

class ApplicationController < ActionController::Base
...
  def jsonapi_class
    super.merge(
      'ActiveStorage::Attachment': SerializableAttachment
    )
  end
end

现在我可以实现 DELETE /attachments/:id