【Rails】CarrierWaveでqualityが指定できなくなっていた問題を解決

Irails

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では以前として古い書き方のままになっているので注意が必要です。