通过 API 调用从集合中删除单个 ActiveStorage 附件
Deleting a single ActiveStorage attachment out of a collection via an API call
编辑:TLDR:这归结为序列化附件。看我的回复。
我可以看到两种实现此目的的方法:
(1) 序列化附件(使用 id
和 url
属性),从而为 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
。
编辑:TLDR:这归结为序列化附件。看我的回复。
我可以看到两种实现此目的的方法:
(1) 序列化附件(使用 id
和 url
属性),从而为 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.
在控制器中,我 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
。