2011-05-12 21 views
18

Carrierwave, varsayılan olarak, yükleyicide store_dir tarafından oluşturulan URL'yi alır ve yolu raylar uygulamasının ortak klasörüne yollar ve dosyaları saklar. ÖrneğinDosyaların ortak klasöründe carrierwave tarafında nasıl saklanır?

biri kamu klasörün dışına saklanan dosyaları taşımak çalışırsa

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

ardından dosya public/uploads/:attachment_id

arasında saklandığında hala kamu klasörde kaydeder. Herkes ortak klasör dışında dosyaları saklamak hakkında bir fikri var mı ??

cevap

34

en temiz yolu,

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

sonra store_dir bu kökün içine kullanılacak CarrierWave kök seçeneğini ayarlayarak gereğidir. Ayrıca böyle bir şey yapabileceği mağaza dizin içerisinde

12

Bunun gerçekten geçerli bir soru olmadığını anlıyorum, ancak başka bir şey aramak için tökezledim. Bu sorunun cevabı sadece Rails.root, örneğin kullanmaktır: Bunu yapmak için

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

Büyük olasılıkla "Sprockets :: FileOutsidePaths" hatasına girdiğinizden emin olun. – Tommyixi

0

:

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

benim için işe yaramadı config_root değişen çözümü.

0

birisi gösterilmesini istiyorsanız, RSpec için sonra sadece

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

    it { ... } 
end 

yapmak gerekiyorsa tüm testler için

# 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

Çok daha temiz bir çözüm tanımlamak olacağını:

def store_dir 
    nil 
end 

Bkz. the docs

+0

plus1 bu "resmi" yoldur –