Как хранить файлы вне публичной папки в carrierwave? - PullRequest
18 голосов
/ 12 мая 2011

Carrierwave по умолчанию берет URL, сгенерированный store_dir в загрузчике, и добавляет путь к общедоступной папке приложения rails и сохраняет файлы.

Например, если

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

, тогда файл сохраняется в public/uploads/:attachment_id

Если вы попытаетесь переместить сохраненные файлы из общей папки, они сохранятся в общей папке. У кого-нибудь есть идеи как хранить файлы вне публичной папки ??

Ответы [ 5 ]

34 голосов
/ 09 августа 2011

Самый чистый способ сделать это, установив корневой параметр CarrierWave

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

тогда store_dir будет использоваться внутри этого корня.

12 голосов
/ 22 июня 2011

Я понимаю, что это не совсем актуальный вопрос, но я наткнулся на него в поисках чего-то еще.Ответ прост: используйте Rails.root, например:

  def store_dir
    "#{Rails.root}/private/files/#{model.id}"
  end
6 голосов
/ 28 марта 2014

Гораздо более чистым решением было бы определить:

def store_dir
  nil
end

См. документы

0 голосов
/ 10 марта 2014

Если кому-то это нужно только для 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
0 голосов
/ 23 февраля 2013

Внутри магазина вы также можете сделать что-то вроде этого:

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

решение об изменении config_root у меня не сработало.

...