Vraag Hoe kan ik bestanden opslaan in de openbare map in carrierwave?


Carrierwave neemt standaard de URL op die is gegenereerd door store_dir in de uploader en past het pad naar de openbare map van de rails-applicatie toe en slaat de bestanden op.

Bijvoorbeeld als

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

dan wordt het bestand opgeslagen op public/uploads/:attachment_id

Als iemand probeert de opgeslagen bestanden uit de openbare map te verwijderen, wordt deze opgeslagen in de openbare map. Heeft iemand een idee van hoe de bestanden buiten de openbare map te bewaren?


18
2018-05-12 13:56


oorsprong


antwoorden:


de schoonste manier om dit te doen, is door de CarrierWave-rootoptie in te stellen

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

dan store_dir zal in deze root worden gebruikt.


34
2017-08-09 14:57



Ik besef dat dit niet echt een actuele vraag is, maar ik struikelde erover op zoek te zijn naar iets anders. Het antwoord is simpelweg Rails.root gebruiken, bijvoorbeeld:

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

12
2018-06-22 14:38



Een veel schonere oplossing zou zijn om te definiëren:

def store_dir
  nil
end

Zien de documenten


5
2018-03-28 07:28



Binnen de winkel kun je ook zoiets als dit doen:

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

de oplossing voor het wijzigen van de config_root werkte niet voor mij.


0
2018-02-23 02:13



Als iemand dat alleen voor RSpec nodig heeft, doe het dan gewoon

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

  it { ... }
end

als je dat wilt voor al je testen

# 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