与存储交互时如何动态选择雾提供者?

问题描述 投票:0回答:1

我有一个简单的轨道模型,其中包含一个

image
。这些图像当前存储在 AWS S3 中,但我需要将它们移动到 Backblaze。我有一个上传器类,看起来也像这样:

class CarImage < ApplicationRecord
  VALID_BACKENDS = [:s3, :backblaze].freeze
  enum backend: VALID_BACKENDS
  mount_uploader :image, CarImageUploader

  belongs_to :car
end

class CarImageUploader < CarrierWave::Uploader::Base
  configure do |config|
    config.fog_credentials = {
      provider: "AWS",
      aws_access_key_id: Rails.application.credentials.aws_access_key_id,
      aws_secret_access_key: Rails.application.credentials.aws_secret_access_key,
      region: Rails.application.credentials.aws_region
    }
    config.fog_directory  = Rails.application.credentials.aws_image_bucket
    config.fog_public     = true
    config.fog_attributes = { "Cache-Control" => "max-age=315576000" }
    config.remove_previously_stored_files_after_update = false
  end

  def store_dir
    "uploads/car_images/#{model.car_id}"
  end
end

现在我的问题是,我需要根据

config.fog_credentials
动态更改
model.backend
。我怎样才能实现这个目标?我可以在一个上传器中完成此操作,还是需要不同的上传器类 - 如果是这样,我如何根据
CarImage
属性选择哪个上传器类应用于
backend
模型?

问候

ruby-on-rails ruby fog backblaze
1个回答
1
投票

您可以检查

model
的后端并适当设置凭据:

class CarImage < ApplicationRecord
  VALID_BACKENDS = [:s3, :backblaze].freeze
  enum backend: VALID_BACKENDS
  mount_uploader :image, CarImageUploader

  belongs_to :car
end

class CarImageUploader < CarrierWave::Uploader::Base
  configure do |config|
    config.fog_public     = true
    config.fog_attributes = { "Cache-Control" => "max-age=315576000" }
    config.remove_previously_stored_files_after_update = false
  end

  def fog_credentials
    model.s3? ? s3_fog_credentials : backblaze_fog_credentials
  end

  def fog_directory 
    model.s3? ? Rails.application.credentials.aws_image_bucket : Rails.application.credentials.backblaze_image_bucket
  end

  def store_dir
    "uploads/car_images/#{model.car_id}"
  end

  private

  def s3_fog_credentials
    {
      provider: "AWS",
      aws_access_key_id: Rails.application.credentials.aws_access_key_id,
      aws_secret_access_key: Rails.application.credentials.aws_secret_access_key,
      region: Rails.application.credentials.aws_region
    }
  end

  def backblaze_fog_credentials
    # your backblaze go here
  end
end
© www.soinside.com 2019 - 2024. All rights reserved.