Условные версии в Carrierwave

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

-Бенни

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

person user1282026    schedule 20.03.2012    source источник


Ответы (2)


Проблема в том, что вы дважды определили версию :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

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

person jefflunt    schedule 03.04.2012
comment
Я думаю, что пробовал это раньше, и это не сработало, потому что is_landscape требует передачи изображения, а этого не происходит, когда вы используете is_landscape в качестве аргумента для обработки, а не версии. Есть ли способ получить доступ к объекту изображения, когда вы передаете метод процессора для обработки? - person user1282026; 11.04.2012

Вот решение:

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