编辑: TLDR :归结为序列化附件。查看我的回应。
我可以看到两种方法来实现这一目标:
(1)序列化附件(具有id
和url
属性),从而为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
。不确定是否可行?
我更喜欢第一个解决方案,它感觉更干净,适应性更强。任何一种方法的任何帮助将不胜感激!
答案 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
。