Activestorage: получить ключ S3 (не ключ BLOB-объекта Rails) - PullRequest
1 голос
/ 14 мая 2019

Я использую Activestorage. Я хочу получить ключ S3 для передачи в микросервис. Я не хочу загружать BLOB-объекты или что-то подобное в приложении Rails, я просто хочу указать путь к файлу / ключ в запросе API.

service_url - это излишне, потому что у меня уже есть доступ к корзине в микросервисе, не говоря уже о том, что это большие файлы, и мне не нужно передавать их без необходимости.

Какие у меня варианты?

Ответы [ 2 ]

1 голос
/ 17 мая 2019

Использование service_url не только излишне, но и приводит к проблемам, если вы пытаетесь использовать его вне контроллера ActiveStorage, , как описано здесь .

Лучше ActiveStorage # key , который для S3 вернет просто ключ S3 для вашего объекта.Это все еще не то, что вы должны использовать для общедоступных значений - ActiveStorage#signed_id дает вам ключ от Rails.Но если вам нужен необработанный ключ S3 (как я сделал для сервисного API), key работает и не жалуется вне контроллера.

Так в вашем случае:

def logo_key_on_s3
  logo.key
end

должно работать.

0 голосов
/ 15 мая 2019

Таким образом, хотя @ bo-oz и ссылался на полезную дискуссию, он на самом деле не отвечал на вопрос, поэтому для получения ключа, под которым файл хранится на S3:

class User < ApplicationRecord
  has_one_attached :logo

  def logo_key_on_s3
    logo&.service_url&.split('?')&.first
  end
end

Это просто генерирует URL-адрес службы и удаляет все маркеры доступа, срок действия и т. Д., И это все, что мне нужно, поскольку микросервис уже имеет доступ к корзине. Важно помнить, что Activestorage запутывает имена файлов, что затрудняет их поиск.

...