Search code examples
amazon-s3carrierwaveminimagick

Minimagick undefined method `width='


I want to use specific version of image by their width and height. So I followed How-to:-Get-image-dimensions this wiki, but got undefined method "width=". My uploader looks like,

class S3uploaderUploader < CarrierWave::Uploader::Base

  include CarrierWave::MiniMagick
  # Include RMagick or MiniMagick support:
  # include CarrierWave::RMagick
  # include CarrierWave::MiniMagick
  process :store_dimensions


  # Choose what kind of storage to use for this uploader:
  # storage :file
  storage :fog

  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end


  version :detail do
    process :quality => 90
    process :store_dimensions
  end


  version :mainVertical do
    process :quality => 80
    process :store_dimensions
    process :resize_to_fit => [240, 180]
  end

  version :mainHorizontal do
    process :quality => 80
    process :store_dimensions
    process :resize_to_fit => [240, 320]
  end

  private

  def store_dimensions
    if file && model
      model.width, model.height = ::MiniMagick::Image.open(file.file)[:dimensions]
    end
  end
end

What am I missing? Any suggestions? Thanks.


Solution

  • I got an idea from this post. conditional-image-resizing-with-carrierwave. It works well.

    And I changed my code like this.

    class S3uploaderUploader < CarrierWave::Uploader::Base
    
      include CarrierWave::MiniMagick
    
      storage :fog
    
      def store_dir
        "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
      end
    
        version :detail do
          process :quality => 90
        end
        version :main, :if => :image?  do
            process :quality => 90
            process :resize_to_fit => [240, 180] ,:if => :horizontal?
            process :resize_to_fit => [240, 320]  ,:if => :vertical?
        end
    
      def image?(new_file)
          self.file.content_type.include? 'image'
      end
    
      def horizontal?(new_file)
        image = MiniMagick::Image.open(self.file.file)
        true if image[:height] < image[:width]
      end
    
      def vertical?(new_file)
        image = MiniMagick::Image.open(self.file.file)
        true if image[:height] > image[:width]
      end
    end