Варианты динамического ведра EC2 для тумана/несущей волны

У меня есть приложение Rails3, которое использует Carrierwave и Fog для хранения данных на Amazon S3. Это приложение, которое я создаю, требует, чтобы у каждого пользователя была собственная защищенная корзина EC2. Предпосылка приложения заключается в том, что пользователь создаст учетную запись (разработку), и я создам ведро хранилища только для этого пользователя под пользователем и паролем EC2 моего приложения. Основываясь на текущей документации, я не видел способа иметь несколько сегментов, поскольку это настроено в FOG YML. Я хотел бы попросить альтернативы для динамической установки этого FOG_DIRECTORY на основе атрибутов пользователя.

Я знаю, что есть способ управлять динамическими папками, но это не сработает, так как мне нужны выделенные пользователем сегменты.

Заранее спасибо!


person Gregg    schedule 21.03.2012    source источник
comment
Можете ли вы уточнить, почему вы не можете использовать динамические папки? Нужен ли вашим пользователям прямой доступ, кроме как через ваше приложение? Если нет, подписанные URL-адреса прекрасно работают.   -  person Carson Cole    schedule 30.03.2012
comment
В настоящее время каталог FOG установлен в моем тумане yml. Я хотел бы сохранить идентификатор ведра на уровне пользователя. Когда мне нужно сохранить некоторую информацию, я ищу пользователя и нахожу идентификатор корзины для использования. Моя проблема в том, как установить этот каталог тумана вне конфигурации yml?   -  person Gregg    schedule 06.04.2012


Ответы (1)


Предполагая, что ваши ведра уже существуют. Попробуйте следующее:

#config/initializers/carrierwave.rb

CarrierWave.configure do |config|
  #...other configuration stuff...
  config.fog_directory = 'null.example.com'

  config.fog_host = proc do
    proc do |file|
      uploader = file.instance_variable_get :@uploader
      "http://#{uploader.fog_directory}"
    end
  end
end

Обратите внимание на вложенные процедуры, на момент написания этого ответа документация для несущей волны неверна. Если вы хотите, чтобы туман_хост был динамическим, вы должны обернуть процесс так, чтобы класс конфигурации несущей волны работал правильно.

Несмотря на то, что туман_каталог устанавливается динамически позже. Тестовые фреймворки и тому подобное жалуются, если что-то не установлено в инициализаторе (если все работает правильно, настройка всегда переопределяется).

#app/controllers/application_controller.rb

before_filter :set_bucket

def set_bucket
  CarrierWave.configure do |config|
    config.fog_directory = "#{current_user.id}.bucket.example.com"
  end
end

Измените функцию set_bucket, чтобы она соответствовала вашему соглашению об именах сегментов.

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

Также в этот пост в блоге описан другой подход.

person codingFoo    schedule 06.10.2012