2012-03-20 12 views
4

アップロードされた画像に対して単純なrotate + resizeを実行するよう努めていますが、これはランドスケープ形式の場合のみです。それ以外の場合は、イメージのサイズを変更したいだけです。私はまた、バージョン名を同じに保ちながらこれをやりたいと思っています( "中"と "中回転"はありません)。これまで私は回転を行いましたが、問題は、非風景画像をアップロードした場合です。まったく仕事。美しい画像の場合にのみ機能します。これまでのところ私のコードの関連部分があります。何か案は?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を返します。その結果、何も行われません。同じ名前の2つのバージョンを宣言することができないので、2番目のversion :mediumの宣言は実行されません。したがって、完全にスキップされています。

あなたがする必要があるのは、:mediumという名前の1つのバージョンを生成し、条件付きで時計回りの回転を処理することです。何かのように:

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つのバージョンで複数の処理ステップを連鎖させることができます。ここでは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