Условные версии в Carrierwave - PullRequest
4 голосов
/ 21 марта 2012

Я работаю над простым поворотом + изменением размера загруженного изображения, но только если это альбомный формат.В противном случае, я просто хочу изменить размер изображения.Я также хочу сделать это, сохраняя при этом название версии (не имеющее «medium» и «medium_rotated»). Пока у меня работает rotate, но проблема в том, что если я загружаю не альбомное изображение, оно неработать на всех.Это работает только для ландшафтных изображений.Вот соответствующие части моего кода до сих пор.Есть идеи?

-Бенни

class FloorPlanPhotoUploader < CarrierWave::Uploader::Base

  ....

  version :medium, :if => :is_landscape? do
    process :rotate_cw
  end

  version :medium do
    process :resize_and_pad => [ 260, 360, :white, 'Center']
  end

  def is_landscape? picture
    file =  (picture.is_a? CarrierWave::Storage::Fog::File) ? picture.public_url : picture.file
    image = MiniMagick::Image.open(file)
    image[:width] > image[:height]
  end

  def rotate_cw    
    manipulate! do |img|
      img.rotate "90>"
      img = yield(img) if block_given?
      img
    end
  end

  ....

end

Ответы [ 2 ]

3 голосов
/ 03 апреля 2012

Проблема в том, что вы определили версию :medium дважды.Он попадает в часть:

..., :if => is_landscape?

, которая для изображений без ландшафта возвращает false.В результате ничего не сделано.Второе объявление version :medium, которое у вас есть, никогда не запускается, потому что вы не можете объявить две версии с одинаковыми именами, поэтому оно просто полностью пропущено.

Вам нужно создать только одну версиюс именем :medium и условно обрабатывать вращение по часовой стрелке.Что-то вроде:

class FloorPlanPhotoUploader < CarrierWave::Uploader::Base

  ...

  version :medium do
    process :rotate_cw, :if => :is_landscape?
    process :resize_and_pad => [ 260, 360, :white, 'Center']
  end

  ...
end

Вы можете таким образом объединить несколько этапов обработки в одной версии.Здесь является отличным учебником , который углубляется в эту тему.

1 голос
/ 26 марта 2013

Вот решение:

version :medium do
  process :rotate_cw, if: ->( uploader, args ) { uploader.model.is_landscape? }
  process :resize_and_pad => [ 260, 360, :white, 'Center']
end
...