【问题标题】:Graceful fallback for non-default Active Storage service in Rail 6.1Rail 6.1 中非默认 Active Storage 服务的优雅回退
【发布时间】:2021-08-25 22:37:12
【问题描述】:

我最近利用 Rails 6.1 支持在一个应用中使用多个不同的 Active Storage 服务,在一个关联的基础上:

class MyClass < ApplicationRecord
  has_many_attached :cool_documents
  has_many_attached :even_cooler_documents, service: :my_new_service
end

storage.yml 看起来像这样:

local:
  service: Disk
  root: <%= Rails.root.join("storage") %>

my_first_service:
  service: S3
  access_key_id: <%= ENV['AWS_ACCESS_KEY'] %>
  secret_access_key: <%= ENV['AWS_SECRET_KEY'] %>
  region: us-east-1
  bucket: <%= ENV['MY_FIRST_BUCKET'] %>

my_new_service:
  service: S3
  access_key_id: <%= ENV['AWS_ACCESS_KEY'] %>
  secret_access_key: <%= ENV['AWS_SECRET_KEY'] %>
  region: us-east-1
  bucket: <%= ENV['MY_NEW_BUCKET'] %>

但是,我们有一个开发人员的生活质量问题——我们真的很喜欢为本地开发人员提供一种回退机制,它说“你有 AWS 存储配置所需的 ENV 变量吗?如果有,让我们使用它。如果没有,让我们使用本地存储。”这体现在我们development.rb 配置文件中的一些代码中,如下所示:

  config.active_storage.service = if ENV["AWS_ACCESS_KEY"].present? && ENV["AWS_SECRET_KEY"].present?
    :my_first_service
  else
    :local
  end

当应用程序只有一个相关的 Active Storage 服务时,这非常有效——默认值。但是,my_new_service 的配置打破了这一点——您必须拥有正确的 ENV 配置才能配置my_new_service,否则应用程序在无法配置服务时会抛出错误。此外,到目前为止,我无法弄清楚如何优雅地完成这项工作并以我想要的方式“热交换”配置。有没有人对我们如何配置它有任何想法?

【问题讨论】:

    标签: ruby-on-rails ruby rails-activestorage


    【解决方案1】:

    您的storage.yml 是一个erb 文件,因此您可以在其中管理它。这不是很好,但应该可以。

    local:
      service: Disk
      root: <%= Rails.root.join("storage") %>
    
    my_first_service:
      service: S3
      access_key_id: <%= ENV['AWS_ACCESS_KEY'] %>
      secret_access_key: <%= ENV['AWS_SECRET_KEY'] %>
      region: us-east-1
      bucket: <%= ENV['MY_FIRST_BUCKET'] %>
    
    my_new_service_prod:
      service: S3
      access_key_id: <%= ENV['AWS_ACCESS_KEY'] %>
      secret_access_key: <%= ENV['AWS_SECRET_KEY'] %>
      region: us-east-1
      bucket: <%= ENV['MY_NEW_BUCKET'] %>
    
    <% if Rails.env.production? %>
    my_new_service:
      service: my_new_service_prod
    <% else %>
    my_new_service:
      service: local
    <% end %>
    

    在生产中my_new_service 现在将指向本地,否则指向local

    【讨论】:

      猜你喜欢
      • 2018-10-12
      • 2022-11-28
      • 2021-03-26
      • 2021-04-18
      • 2016-10-09
      • 1970-01-01
      • 2013-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多