Railsプロジェクトをrmagickをv5系にバージョンアップしたところ、CarrierWaveを使ってアップロードした画像を圧縮している以下のコードが動かなくなっていました。
def quality(percentage) manipulate! do |img| img.write(current_path){ self.quality = percentage } unless img.quality == percentage img = yield(img) if block_given? img end end
「undefined method quality」というエラーが表示され、どうやら「self.quality」の呼び出しがエラーになっている模様。rmagickをバージョンダウンすれば問題は解決するのですが、今回は真面目に解決方法を探してみました。
以下のように修正して動くことを確認しました。
def quality(percentage) manipulate! do |img| img.write(current_path){ |options| options.quality = percentage } unless img.quality == percentage img = yield(img) if block_given? img end end
rmagickのwriteなど一部のメソッドはblock引数をとり、依然はそのブロックの引数はなくself.qualityのような呼び出しが可能だったのですが、rmagick5では引数が追加され(例えばoptionsを、options.qualityのように呼び出さないといけないようです。
ChangeLogを確認すると、4.2.0で警告が導入されており、その後削除されたという流れだと思われます。
CarrierWaveのWikiでは以前として古い書き方のままになっているので注意が必要です。