如何将文件存储在carrierwave中的公共文件夹旁边?

时间:2011-05-12 13:56:26

标签: ruby ruby-on-rails-3 carrierwave

Carrierwave默认接受上传者中store_dir生成的网址,并预先设置rails应用程序公共文件夹的路径并存储文件。

例如,如果

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

然后文件存储在public/uploads/:attachment_id

如果尝试将存储的文件移出公用文件夹,它仍会保存在公用文件夹中。有没有人知道如何将文件存储在公共文件夹之外?

5 个答案:

答案 0 :(得分:34)

最干净的方法是设置CarrierWave根选项

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

然后store_dir将在此根目录中使用。

答案 1 :(得分:12)

我意识到这不是一个当前的问题,但我偶然发现它寻找其他东西。答案就是使用Rails.root,例如:

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

答案 2 :(得分:6)

更清洁的解决方案是定义:

def store_dir
  nil
end

请参阅the docs

答案 3 :(得分:0)

在商店目录内你也可以这样做:

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

更改config_root的解决方案对我不起作用。

答案 4 :(得分: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