Удаление одного вложения ActiveStorage из коллекции с помощью вызова API
РЕДАКТИРОВАТЬ: TLDR: это сводится к сериализации вложений. Смотрите мой ответ.
Я вижу два способа добиться этого:
(1) Сериализация приложений (с id
а также url
атрибуты), таким образом, обеспечивая id
FE, что они могут использовать для DELETE /attachments/:id
который бы тогда позвонил ActiveStorage::Attachment.find(:id).purge
, Проблема заключается в сериализации, поскольку вложения не имеют встроенных моделей. Я пытался создать ActiveStorageAttachment
модель для active_storage_attachments
таблицы, но не удалось получить URL для вложения в качестве Rails.application.routes.url_helpers.url_for(@object)
требует ActiveStorage::Attachment
объект не ActiveStorageAttachment
объект.
(2) Другой вариант будет иметь DELETE /attachments/:attachment_url
конечная точка. Чтобы это работало, мне нужно получить ActiveStorage::Attachment
объект на основе URL, для вызова purge
в теме. Не уверен, что это возможно?
Я бы предпочел первое решение, оно выглядит чище и более адаптируемо. Любая помощь с любым подходом будет высоко ценится!
1 ответ
В итоге мне удалось сериализовать прикрепленные изображения (опция (1) выше), используя jsonapi-rb
драгоценный камень.
В контроллере я 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
,