21

Carrierwave 默认接收store_dir上传器生成的 url,并将路径添加到 rails 应用程序的公共文件夹并存储文件。

例如,如果

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

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

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

4

5 回答 5

40

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

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

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

于 2011-08-09T14:57:47.180 回答
12

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

  def store_dir
    "#{Rails.root}/private/files/#{model.id}"
  end
于 2011-06-22T14:38:40.390 回答
8

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

def store_dir
  nil
end

查看文档

于 2014-03-28T07:28:13.203 回答
0

在商店目录中,您还可以执行以下操作:

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

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

于 2013-02-23T02:13:11.203 回答
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
于 2014-03-10T09:48:42.787 回答