2011-05-12 13 views
18

Carrierwave toma por omisión la URL generada por store_dir en la herramienta de subida y deja la ruta a la carpeta pública de la aplicación de rieles y almacena los archivos.¿Cómo almacenar archivos fuera de la carpeta pública en carrierwave?

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 todavía se guarda en la carpeta pública. ¿Alguien tiene una idea de cómo almacenar los archivos fuera de la carpeta pública?

Respuesta

34

la manera más limpia de hacer esto, es mediante el establecimiento de la opción de raíz CarrierWave

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

continuación store_dir se utilizará en el interior de esta raíz.

12

Me doy cuenta de que esto no es realmente una pregunta actual, pero me encontré con que buscaba algo más. La respuesta es simplemente usar Rails.root, por ejemplo:

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

Tenga cuidado, ya que es muy probable que se encuentre con el error "Sprockets :: FileOutsidePaths". – Tommyixi

0

Dentro de la tienda dir también se puede 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í.

0

Si alguien necesita que se acaba de RSpec a continuación, sólo hacer

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

    it { ... } 
end 

si quieres que para todas sus 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 
5

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

def store_dir 
    nil 
end 

Ver the docs

+0

plus1 esta es la forma "oficial" –

Cuestiones relacionadas