2011-05-12 20 views
18

Carrierwave theo mặc định có trong url được tạo bởi store_dir trong trình tải lên và thêm đường dẫn đến thư mục công khai của ứng dụng đường ray và lưu trữ tệp.Làm thế nào để lưu trữ các tập tin ra bên thư mục công cộng trong carrierwave?

Ví dụ nếu

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

sau đó các tập tin được lưu trữ tại public/uploads/:attachment_id

Nếu một cố gắng để di chuyển các tập tin được lưu trữ ra khỏi thư mục công cộng vẫn tiết kiệm trong thư mục công cộng. Có ai có ý tưởng làm thế nào để lưu trữ các tập tin bên ngoài thư mục công cộng?

Trả lời

34

cách sạch để làm điều này, là bằng cách thiết lập các tùy chọn gốc CarrierWave

CarrierWave.configure do |config| 
    config.root = Rails.root 
end 

sau đó store_dir sẽ được sử dụng bên trong thư mục gốc này.

12

Tôi nhận ra đây không thực sự là câu hỏi hiện tại, nhưng tôi tình cờ tìm kiếm một thứ khác. Câu trả lời chỉ đơn giản là sử dụng Rails.root, ví dụ:

def store_dir 
    "#{Rails.root}/private/files/#{model.id}" 
    end 
+0

Hãy cẩn thận vì bạn rất có thể sẽ gặp phải lỗi "Sprockets :: FileOutsidePaths". – Tommyixi

0

Bên trong cửa hàng dir bạn cũng có thể làm điều gì đó như thế này:

def store_dir 
    "#{Rails.root.join('public', 'system', 'uploads')}/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 
end 

giải pháp của việc thay đổi config_root không làm việc cho tôi.

0

Nếu ai đó cần điều đó chỉ dành riêng cho RSpec sau đó chỉ cần làm

describe SomeClass do 
    before do 
    CarrierWave.stub(:root). 
     and_return(Pathname.new "#{Rails.root}/tmp/fake_public") 
    end 

    it { ... } 
end 

nếu bạn muốn điều đó cho tất cả các bài kiểm tra của bạn

# spec/spec_helper.rb 
RSpec.configure do |config| 
    # ... 
    config.before :each do 
    # ... 
    CarrierWave.stub(:root).and_return(Pathname.new "#{Rails.root}/tmp/public") 
    end 
end 
5

Một giải pháp nhiều hơn nữa sạch sẽ được xác định:

def store_dir 
    nil 
end 

Xem the docs

+0

plus1 đây là cách "chính thức" –

Các vấn đề liên quan