Search code examples
rubyruby-on-rails-3carrierwavermagick

Using a Carrierwave custom process I'm not able to access the model.id (multi-page PDF)


The idea is, I want to convert a PDF to an image per page. I've tried other methods which are on Stackoverflow but to no avail. Below is my uploader file.

Uploader

class PdfUploader < CarrierWave::Uploader::Base
  include CarrierWave::RMagick
  #//TODO - Remove converted images when deleting an entry, maybe? if needed?

  storage :file

  #//TODO - Add images into the same folder. model.id can't be accessed in a custom process.

  def store_dir
    "#{Rails.root}/public/uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end
  def cache_dir
    "#{Rails.root}/public/uploads/#{model.class.to_s.underscore}/#{mounted_as}/tmp"
  end

  def extension_white_list
    %w(pdf)
  end

  def filename
    super.chomp(File.extname(super)) + '.png'
  end

  version :pages do
    process :create_pages
    process convert: 'png'
  end

  process convert: 'png'

  version :thumb do
    process :cover
    process :resize_to_fill => [200, 200, Magick::CenterGravity]
    process convert: 'png'
  end

  def cover
    manipulate! do |frame, index|
      frame if index.zero?
    end
  end

  def create_pages
    manipulate! do |frame, index|
      frame.write("#{store_dir}/#{index}.png")
    end
  end

end

The PDF will get converted to images for each page. But it will not recognize the model.id and store it in that folder. Instead it will store in the directory above that. I've tried the adding the following to force the making of the folder, but it doesn't seem to know the model.id through a little bit of testing?

Tried to Make Dir

def create_pages
    Dir.mkdir(store_dir) unless File.exists?(store_dir)
    manipulate! do |frame, index|
      frame.write("#{store_dir}/#{index}.png")
    end
  end 

Help would be much appreciated, I've been stuck on this for a while and had to leave it for a couple of days out of frustration. Thank you in advance.


Solution

  • This is most likely because you are saving your images with frame.write before the model itself is saved, and therefore also before an ID has been assigned.

    Have a look at this answer for a potential solution: Carrierwave : error with model.id in the store_path