Pregunta ¿Cómo almacenar archivos fuera de la carpeta pública en carrierwave?


Carrierwave toma de forma predeterminada la URL generada por store_dir en el cargador y hace la ruta a la carpeta pública de la aplicación de rieles y almacena los archivos.

Por ejemplo si

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

entonces el archivo se almacena en public/uploads/:attachment_id

Si uno trata de mover los archivos almacenados fuera de la carpeta pública aún se guarda en la carpeta pública. ¿Alguien tiene una idea de cómo almacenar los archivos fuera de la carpeta pública?


18
2018-05-12 13:56


origen


Respuestas:


la forma más limpia de hacerlo es estableciendo la opción raíz CarrierWave

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

entonces store_dir se usará dentro de esta raíz.


34
2017-08-09 14:57



Me doy cuenta de que esto no es realmente una pregunta actual, pero me encontré con que buscaba otra cosa. La respuesta es simplemente utilizar Rails.root, por ejemplo:

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

12
2018-06-22 14:38



Una solución mucho más limpia sería definir:

def store_dir
  nil
end

Ver los documentos


5
2018-03-28 07:28



Dentro de la tienda dir también puedes hacer algo como esto:

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

la solución de cambiar config_root no funcionó para mí.


0
2018-02-23 02:13



Si alguien necesita eso solo para RSpec, simplemente hazlo

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

  it { ... }
end

si quieres eso para todas tus pruebas

# 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
2018-03-10 09:48