Я создал гибридное приложение 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.
Благодарим вас за отзыв о том, чего мне здесь не хватает.
Спасибо,
Решил это. В моем сериализаторе вместо:
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 мин.