Облачное хранилище Google — получение общедоступного URL-адреса без указания конкретного имени файла

#ruby-on-rails #google-app-engine #google-cloud-platform #google-cloud-storage #rails-activestorage

# #ruby-on-rails #google-app-engine #google-облачная платформа #google-облачное хранилище #rails-activestorage

Вопрос:

У меня есть 5.2.3 приложение Rails, размещенное в облачных сервисах Google. В моем интерфейсе я требую, чтобы пользователи загружали изображения своих сотрудников, и эти изображения сохраняются в хранилище GC, и, что важно для моего вопроса, они сохраняются с рандомизированными именами. Таких изображений сотни, и все они содержат в основном случайные строки из 40 символов в качестве имен внутри сегментов.

В БД у каждого пользователя есть несколько сотрудников, и к каждому сотруднику прикреплено одно изображение.

Я пытаюсь создать электронное письмо, в которое мне нужно включить изображение одного конкретного сотрудника для каждого пользователя. Прямо сейчас я использую этот ActiveStorage::service_url метод, но проблема в том, что service_url метод вернет подписанный URL-адрес из GCS, который имеет (по умолчанию) 5-минутный TTL, что означает, что изображение перестанет быть доступным через 5 минут, и пользователи получат поврежденное изображение. Изначально изображение действительно отображается нормально, оно просто истекает через 5 минут.

Пример того, как я использую этот service_url метод в представлении моей почтовой программы

 <%= image_tag (employee.photo.service_url) if employee.photo.attached? %>
 

Теперь в документах GCS указано, что для получения общедоступного URL-адреса вам просто нужно использовать BUCKET_NAME/FILE_NAME URL-адрес, но поскольку таких файлов сотни, и они сохраняются с рандомизированными именами (я не тот, кто установил это изначально, не спрашивайте почему), у меня просто нетспособ сделать это разумным способом для каждого пользователя, тем более, что это еженедельное электронное письмо, которое отправляется каждому пользователю с указанием их сотрудников, которые работают лучше всего, поэтому даже для одного клиента в электронном письме будет использоваться другая картинка из недели в неделю.

Есть ли у меня какой-либо способ получить общедоступный URL-адрес изображения для использования в этих электронных письмах?

Мой storage.yml файл

 google:
  service: GCS
  project: REDACTED
  credentials: <%= Rails.application.credentials.gcs_storage_credentials.to_json %>
  bucket: images-REDACTED
 

Мой production.rb env-файл

 config.active_storage.service = :google
config.action_mailer.asset_host = Rails.application.credentials.send(production_server_url)
 

Мой Gemfile

 ruby '2.6.3'
gem 'rails', '~> 5.2.3'
gem 'pg', '>= 0.18', '< 2.0'
gem 'active_storage_base64'
gem 'google-cloud-storage', '~> 1.8', require: false
 

Комментарии:

1. Вы проверили api.rubyonrails.org/classes/ActiveStorage /… ?

2. @max К сожалению, я использую Rails 5.2.3, который не поддерживает этот Blob::url метод (если я не ошибаюсь, вызов employee.photo.url возвращает undefined method ошибку)

3. service_url должна быть подпись, чтобы вы могли использовать service_url(expires_in: 1.year.to_i) . api.rubyonrails.org/v5.2.4.4/classes/ActiveStorage /…

4. @max Beautiful, это сработало! Кажется немного странным, есть ли какие-либо недостатки в этом маршруте? Вероятно, вам следует опубликовать его в качестве ответа, чтобы я мог пометить его как правильный

5. Я не могу придумать ничего конкретного с головы до ног. Кроме того, вы не должны ставить пробелы между именем метода и скобками, как в image_tag (employee.photo.service_url) . Поскольку скобки в ruby являются необязательными, они фактически оцениваются как image_tag((employee.photo.service_url)) — и если вы добавите дополнительный аргумент, вы получите синтаксическую ошибку.

Ответ №1:

Вы можете установить срок действия для каждого URL-адреса:

 image_tag(employee.photo.service_url(expires_in: 1.year.to_i))
 

Ответ №2:

Хотя ответ Макса является хорошим, если вам понадобится, чтобы ваши активы в конечном итоге истекли, мне нужно было более постоянное решение. Оказывается, это было действительно просто, мне просто нужно было позвонить employee.photo , и GCS, похоже, выдает постоянный URL-адрес!