IvanV
IvanV

Reputation: 51

Dynamic store dirs for same models with carrierwave

I am using CarrierWave with fog to upload my images to S3.

I have model Image that can represent images of different sizes and according to that needs to be saved in different folder.

For example, for image.jpg I could have two different uploaded versions that need to be saved as:

'images/large/image.jpg'
'images/small/image.jpg'

There could be arbitrary number of use cases and versions using minimagick can't cover them all.

So far I haven't been able to find solution. Does anyone know how to do this?

Upvotes: 0

Views: 894

Answers (2)

IvanV
IvanV

Reputation: 51

I've seen this question asked a few times so I'll write what my final solution is.

Instead of defining mount_uploader on model I decided to just use Uploader independently and save urls to records later.

Dynamically changing store_dir and filename can be accomplished like this

uploader = Uploader.new

uploader.define_singleton_method(:store_dir) do
    'new_store_dir'
end
uploader.define_singleton_method(:filename) do
    'new_filename'
end

uploader.store!(image)

Using this approach you can also define names with local variables or whatever you have available in controller.

Hopefully it helps someone else as well.

Upvotes: 2

widjajayd
widjajayd

Reputation: 6263

in order to change where uploaded files are put, just override the store_dir method:, for your case (reference link)

class Image < CarrierWave::Uploader::Base
storage :file
  # this if you using use condition for folder location
  def store_dir
    if model.somefield == "somecondition
       "uploads/#{model.somefield}"
    elsif model.somefield == "somecondition
       "uploads/location2"
    else
       "uploads/default_dir"
    end

  end
  # this is if you want to use version_name
  def store_dir
    'images/#{version_name}/'
  end
end

Upvotes: 0

Related Questions