Удаление одного вложения 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,

Другие вопросы по тегам