4

我開始玩Carrierwave,作爲Paperclip的替代方案。在Carrierwave使用不同的S3存儲桶進行生產和開發

我可以從文檔,要使用S3我應該在初始化配置迷霧:

CarrierWave.configure do |config| 
    config.fog_credentials = { 
    :provider    => 'AWS',  # required 
    :aws_access_key_id  => 'xxx',  # required 
    :aws_secret_access_key => 'yyy',  # required 
    :region     => 'eu-west-1' # optional, defaults to 'us-east-1' 
    } 

end 

但是,我該如何設置不同的桶不同的環境?使用回形針,我會在yml文件中爲開發/生產/ etc指定不同的憑證和/或桶。用carrierwave做這件事最好的辦法是什麼?

回答

5

,如果你願意,你可以做到這一點幾乎是完全一樣的方式,像這樣完全未經檢驗的想法:

# config/initializers/carrierwave.rb 
CarrierWave.configure do |config| 
    my_config = "#{Rails.root}/config/fog_credentials.yml" 

    YAML.load_file(my_config)[Rails.env].each do |key, val| 
    config.send("#{key}=", val) 
    end 
end 

# config/fog_credentials.yml 
common: &common 
    aws_access_key: 'whatever' 
    ... 
    fog_credentials: 
    provider: 'whoever' 
    ... 
production: 
    <<: *common 
    fog_directory: 'my-production-bucket' 
development: 
    <<: *common 
    fog_directory: 'my-dev-bucket' 

或者,如果你想放棄的YAML,你總是可以簡單測試的環境初始化和使用的情況下或條件,在如最簡單的東西:

CarrierWave.configure.do |config| 
    if Rails.env.development? 
    # configure one env 
    else 
    # configure another 
    end 

    # configure common stuff 
end 
+0

我沒有測試加載YAML文件如你所說的,但我會去與選項2和使用一個簡單的條件陳述。看起來不錯。謝謝! – deb

1
class S3ArticleUploader < CarrierWave::Uploader::Base 

    if Rails.env.test? 
    storage :file 
    else 
    storage :fog 
    end 

    def fog_directory 
    ARTICLE_UPLOADER_BUCKET 
    end 

    def store_dir 
    "#{ model.parent_id }/#{ model.id }" 
    end 

end 

# config/environments/development.rb 
ARTICLE_UPLOADER_BUCKET = 'development-articles' 

# config/environments/production.rb 
ARTICLE_UPLOADER_BUCKET = 'production-articles' 

fog_directory方法調用時,你是不是在TestEnvironment並初始化權 BUCKET。

你也可以這樣做:

def store_dir 
    if self._storage == CarrierWave::Storage::File 
     "#{Rails.root}/tmp/files/#{ model.parent_id }/#{ model.id }" 
    elsif self._storage == CarrierWave::Storage::Fog 
     "#{ model.parent_id }/#{ model.id }" 
    end 
    end 

V2

class S3ArticleUploader < CarrierWave::Uploader::Base 

    if Rails.env.test? 
    storage :file 
    else 
    storage :fog 
    end 

    def initialize 
    self.fog_directory = ARTICLE_UPLOADER_BUCKET 
    end 

    def store_dir 
    "#{ model.parent_id }/#{ model.id }" 
    end 

end