【发布时间】:2021-04-06 01:54:47
【问题描述】:
我有一个 Rails 5.2.3 应用程序托管在 Google Cloud 服务上。在我的前端,我要求用户上传他们员工的图片,这些图片会保存到 GC 存储桶中,重要的是,对于我的问题,它们是用随机名称保存的。有数百张这样的图像,它们基本上都有随机 40 多个字符串作为存储桶内的名称。
在数据库中,每个用户都有多个员工,每个员工都附有一张图片。
我正在尝试创建一封电子邮件,我需要在其中为每个用户添加一个特定员工的图像。现在,我正在使用ActiveStorage::service_url 方法,但问题是service_url 方法将从GCS 返回一个Signed URL,它具有(默认情况下)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 环境文件
config.active_storage.service = :google
config.action_mailer.asset_host = Rails.application.credentials.send(production_server_url)
我的宝石文件
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
【问题讨论】:
-
@max 不幸的是,我在 Rails 5.2.3 上,它不支持
Blob::url方法(除非我错了,调用employee.photo.url会返回undefined method错误)跨度> -
service_url应该有签名,所以你应该能够使用service_url(expires_in: 1.year.to_i)。 api.rubyonrails.org/v5.2.4.4/classes/ActiveStorage/… -
@max 美丽,成功了!不过看起来有点笨拙,走这条路有什么缺点吗?您可能应该将其发布为答案,以便我将其标记为正确
-
我想不出任何特别的事情。在旁注中,您不应该在方法名称和括号之间放置空格,如
image_tag (employee.photo.service_url)。由于括号在 ruby 中是可选的,它实际上被评估为image_tag((employee.photo.service_url))- 如果你添加一个额外的参数,你会得到一个语法错误。
标签: ruby-on-rails google-app-engine google-cloud-platform google-cloud-storage rails-activestorage