#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-адрес!