Предполагая, что ваши ведра уже существуют.
Попробуйте следующее:
#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
Обратите внимание на вложенные процедуры, так как на момент написания этого ответа документация для carrierwave неверна. Если вы хотите, чтобы fog_host был динамическим, вам нужно обернуть процесс так, чтобы класс конфигурации carrierwave делал все правильно.
Несмотря на то, что fog_directory устанавливается динамически позже. Тестовые фреймворки и такие жалуются, если в инициализаторе что-то не установлено (все работает правильно, настройка всегда переопределяется).
#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 в соответствии с вашим соглашением об именах сегментов.
Вы можете добавить некоторую условную логику, если хотите, чтобы в разработке находился фиксированный сегмент, а не сегмент для пользователя.
Также это сообщение в блоге описывает другой подход.