Rails 5.2 - гибридное приложение (Active Storage + S3), URL образа активного хранилища не сгенерирован на стороне API

Я создал гибридное приложение Rails 5.2 с представлениями и контроллером API. Я разрешаю пользователям загружать файлы благодаря активному хранилищу и S3.

Моя активная служба хранения действительно генерирует URL-адрес изображения S3 в моих представлениях Rails, например, как показано в журналах:

Generated URL for file at key: HsBwx3LiGxmSJtDB2pu9nEiJ (https://[DOMAIN_NAME].s3.ca-central-1.amazonaws.com/HsBwx3LiGxmSJtDB2pu9nEiJ?response-content-disposition=....

К сожалению, со стороны API URL-адрес изображения выглядит так:

/rails/active_storage/blobs/...

Идея состоит в том, чтобы использовать этот API в Vue SPA.

Модель

Моя модель довольно проста: 1 модель Продукт с has_one_attached :image.

Сериализатор

Я использую сериализатор для представления этого изображения, например:

include Rails.application.routes.url_helpers

...

def image
    rails_blob_path(object.image, only_path: true) if object.image.attached?  
end

Контроллер API

В моем контроллере API я визуализирую как json мой Продукты, например:

def index
  @products = Product.all
  render json: @products, each_serializer: ::ProductSerializer, status: :ok
end

Конфиг

Я хостинг на Heroku, все env. вары. установлены. Мои производственные настройки выглядят нормально:

config.active_storage.service = :amazon

Тестирование в Postman и в моем приложении Vue, но я все еще получаю URL-адрес блога rails, а не адрес Amazon.

Благодарим вас за отзыв о том, чего мне здесь не хватает.

Спасибо,

Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание API-ресурса Laravel может быть непростой задачей. Она требует глубокого понимания возможностей Laravel и лучших практик, чтобы обеспечить...
Как создать простое погодное приложение на Python с API OpenWeatherMap
Как создать простое погодное приложение на Python с API OpenWeatherMap
Этот учебник проведет вас через процесс создания простого погодного приложения с помощью Python и OpenWeatherMap API.
Пакеты Java
Пакеты Java
Пакет java - это группа классов, интерфейсов и подпакетов схожего типа. Думайте об этом как о папке в каталоге файлов. Мы используем пакеты, чтобы...
Как использовать API парсинга квитанций с помощью JavaScript за 5 минут?
Как использовать API парсинга квитанций с помощью JavaScript за 5 минут?
В этом руководстве вы узнаете, как использовать API парсинга квитанций за 5 минут с помощью JavaScript. Eden AI предоставляет простой и удобный для...
2
0
1 179
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Решил это. В моем сериализаторе вместо:

def image
  rails_blob_path(object.image, only_path: true) if object.image.attached?  
end

Я использую метод Active Storage service_url, например:

def image
  object.image.service_url if object.image.attached?
end

url_for (object.image) сгенерирует постоянный URL-адрес для большого двоичного объекта, указывающего на приложение. При доступе возвращается перенаправление на фактическую конечную точку службы. Это косвенное обращение отделяет общедоступный URL-адрес от фактического и позволяет, например, зеркалировать вложения в различных службах для обеспечения высокой доступности. Перенаправление имеет HTTP-истечение 5 мин.

Ankit Wadhwana 17.09.2019 14:02

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