2012-03-20 7 views
4

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

-Benny

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 

ответ

3

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

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

+0

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

1

Вот решение:

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