rails - manipulacion de archivos en ruby
¿Cómo almacenar archivos fuera de la carpeta pública en carrierwave? (5)
Dentro del directorio de la tienda 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 el config_root no funcionó para mí.
De manera predeterminada, Carrierwave toma la url generada por store_dir
en el cargador y antepone 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 intenta mover los archivos almacenados fuera de la carpeta pública, aún los guarda en la carpeta pública. ¿Alguien tiene una idea de cómo almacenar los archivos fuera de la carpeta pública?
La forma más limpia de hacerlo es establecer la opción de raíz de CarrierWave
CarrierWave.configure do |config|
config.root = Rails.root
end
entonces store_dir
se utilizará dentro de esta raíz.
Me doy cuenta de que esta no es realmente una pregunta actual, pero tropecé en ella buscando otra cosa. La respuesta es simplemente usar Rails.root, por ejemplo:
def store_dir
"#{Rails.root}/private/files/#{model.id}"
end
Si alguien necesita eso solo para RSpec, entonces simplemente haga
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