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

时间:2018-08-20 11:50:24

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

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

我可以看到两种方法来实现这一目标:

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

(2)另一个选择是拥有一个DELETE /attachments/:attachment_url端点。为此,我需要基于URL获取ActiveStorage::Attachment对象,以便在其上调用purge。不确定是否可行?

我更喜欢第一个解决方案,它感觉更干净,适应性更强。任何一种方法的任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

最后,我设法使用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