2011-08-04 30 views
7

Tôi muốn có các thư mục riêng biệt trong thùng S3 để giữ cơ sở dữ liệu sản xuất rõ ràng từ môi trường phát triển. Tôi không chắc chắn làm thế nào để làm điều này, đây là bộ xương tôi đã đi lên với trong initializer carrierwave:Cấu hình Môi trường để Sử dụng các Đường dẫn Lưu trữ Khác nhau trên Amazon S3 với Carrierwave

if Rails.env.test? or Rails.env.development? 
    CarrierWave.configure do |config| 
    //configure dev storage path 
    end 
end 

if Rails.production? 
    CarrierWave.configure do |config| 
    //configure prod storage path 
    end 
end 
+0

Tốt (ngoại trừ lỗi đánh máy nếu sản xuất) – apneadiving

+0

OK và bạn sẽ viết đường dẫn như thế nào? Cái gì đó như 'config.store_dir = "path"'? – PEF

Trả lời

5

Hai lựa chọn:

OPTION1: Bạn không quan tâm đến việc tổ chức file theo mô hình ID

Trong carrierwave.rb initializer của bạn:

Rails.env.production? ? (primary_folder = "production") : (primary_folder = "test") 

CarrierWave.configure do |config| 
    # stores in either "production/..." or "test/..." folders 
    config.store_dir = "#{primary_folder}/uploads/images" 
end 

Tùy chọn 2: Bạn quan tâm đến việc tổ chức các tệp theo ID mô hình (tức là user ID)

Trong tập tin tải lên của bạn (ví dụ: image_uploader.rb trong thư mục uploaders):

class ImageUploader < CarrierWave::Uploader::Base 

    ... 

    # Override the directory where uploaded files will be stored. 
    def store_dir 
    Rails.env.production? ? (primary_folder = "production") : (primary_folder = "test") 

    # stores in either "production/..." or "test/..." folders 
    "#{primary_folder}/uploads/images/#{model.id}" 
    end 

    ... 

end 
+0

OK và bạn sẽ viết cấu hình đường dẫn như thế nào? Một cái gì đó như 'config.store_dir =" path "'? – PEF

+0

Tôi đã cập nhật câu trả lời của mình để cung cấp cho bạn hai tùy chọn – iwasrobbed

+0

Hoạt động tuyệt vời! Cảm ơn – PEF

0

Sử dụng khác nhau Amazon s3 xô cho các môi trường khác nhau của bạn. Trong các tệp .rb môi trường khác nhau của bạn, hãy đặt môi trường cụ thể asset_host. Sau đó, bạn có thể tránh phát hiện môi trường Rails trong trình tải lên của mình.

Ví dụ, trong production.rb:

config.action_controller.asset_host = "production_bucket_name.s3.amazonaws.com" 

Các asset_host trong development.rb trở thành:

config.action_controller.asset_host = "development_bucket_name.s3.amazonaws.com" 

, vv

(Cũng xem xét sử dụng một CDN thay vì lưu trữ trực tiếp từ S3).

Sau đó tải lên của bạn trở thành:

class ImageUploader < CarrierWave::Uploader::Base 

    ... 

    # Override the directory where uploaded files will be stored. 
    def store_dir 
    "uploads/images/#{model.id}" 
    end 

    ... 

end 

Đây là một kỹ thuật tốt hơn từ quan điểm nhân rộng sản xuất trong môi trường khác nhau của bạn.

+0

Tài sản thực sự được đọc ở đâu? Bạn có phải tải nó lên chính mình hoặc không Carrier Wave tự động nhận trên nó? –

2

Xem xét khởi tạo sau:

#config/initializers/carrierwave.rb 

CarrierWave.configure do |config| 
    config.enable_processing = true 

    # For testing, upload files to local `tmp` folder. 
    if Rails.env.test? 
    config.storage = :file 
    config.root = "#{Rails.root}/tmp/" 
    elsif Rails.env.development? 
    config.storage = :file 
    config.root = "#{Rails.root}/public/" 
    else #staging, production 
    config.fog_credentials = { 
     :provider    => 'AWS', 
     :aws_access_key_id  => ENV['S3_KEY'], 
     :aws_secret_access_key => ENV['S3_SECRET'] 
    } 
    config.cache_dir = "#{Rails.root}/tmp/uploads" # To let CarrierWave work on heroku 
    config.fog_directory = ENV['S3_BUCKET'] 
    config.fog_public  = false 
    config.storage = :fog 
    end 
end 
  • Trong phát triển, cập nhật được gửi đến thư mục công cộng địa phương.
  • Ở chế độ kiểm tra, đến thư mục tmp Rails.
  • Và cuối cùng, trong môi trường "khác" (thường là môi trường sản xuất hoặc dàn dựng), chúng tôi hướng tệp đến S3 bằng Biến môi trường để xác định nhóm và thông tin đăng nhập AWS nào sẽ sử dụng.
Các vấn đề liên quan