with rails manipulacion aws archivos ruby ruby-on-rails-3 carrierwave

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


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

def store_dir nil end

Ver los documentos