2011-05-12 13 views
18

Carrierwaveはデフォルトでアップローダのstore_dirによって生成されたURLを受け取り、そのパスをレールアプリケーションのパブリックフォルダに付加して保存します。例えばcarrierwaveのパブリックフォルダの外側にファイルを格納する方法は?

1は、パブリックフォルダの外に保存されたファイルを移動しようとすると

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

は、ファイルがpublic/uploads/:attachment_id

に格納されている場合はまだそれは、パブリックフォルダに保存されます。パブリックフォルダの外にファイルを格納する方法のアイデアは誰にもありますか?

答えて

34

これを行うためのクリーンな方法、そしてstore_dirは、このルートの内部で使用されるCarrierWaveのrootオプション

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

を設定することです。

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

config_rootを変えるのソリューションは私のために動作しませんでした:あなたはまた、このような何かを行うことができますストアディレクトリ内

12

私はこれが実際の質問ではないことを認識していますが、私はそれを見つけて何か他のものを探しました。答えは例えば、Rails.rootを使用するだけです:

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

「Sprockets :: FileOutsidePaths」エラーが発生する可能性が高いので注意してください。 – Tommyixi

0

0

誰かがしたい場合は、単にRSpecのためにそしてちょうど

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

    it { ... } 
end 

を行うことが必要な場合は、すべてのテストのために

# 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

Aはるかにクリーンなソリューションを定義するのであろうと:

def store_dir 
    nil 
end 

the docs

+0

plus1これは「公式な」方法です –

関連する問題