Подтвердить что ты не робот

Как хранить файлы на стороне общей папки в несущей?

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

def store_dir
  nil
end

Смотрите документы

Ответ 4

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

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

решение смены config_root не сработало для меня.

Ответ 5

Если кому-то это нужно только для 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