Help us understand the problem. What is going on with this article?

Rails 6.0の "Active Storage's ImageProcessing transformer doesn't support :combine_options" という警告に対処する方法

困っていたこと

Rails 5.2時代にActiveStorageでこんなコードを書いていました。

user.avatar.variant(
  combine_options: { 
    resize: "150^", 
    gravity: "Center", 
    crop: "150x150+0+0", 
    auto_orient: true  
  }
)

やっていることは縦長だったり横長だったりする画像を、中心で正方形に切り抜いて150x150サイズに縮小することです。(mini_magickを使用)

つまり、この画像↓を、
3500x1500-1.png

こうするわけです↓
3500x1500.png

このコードをRails 6.0に上げるとこんな警告が出ました。

DEPRECATION WARNING: Generating image variants will require the image_processing gem in Rails 6.1. Please add `gem 'image_processing', '~> 1.2'` to your Gemfile. 

なにやらimage_processing gemをインストールしろ、と言われているので、言われたとおりGemfileに追加します。

Gemfile
gem 'image_processing', '~> 1.2'
bundle install

すると、今度は警告の内容が次のように変わりました。

DEPRECATION WARNING: Active Storage's ImageProcessing transformer doesn't support :combine_options, as it always generates a single ImageMagick command. Passing :combine_options will not be supported in Rails 6.1.

こちらの警告は:combine_optionsはRails 6.1でサポートされなくなるぜ!と言われてるものの、具体的な修正方法がわかりません。

解決方法

この警告が導入されたコミットを確認した結果、どうやら:combine_optionsをなくしてこう書けば良いっぽいです。

user.avatar.variant( 
  resize: "150^", 
  gravity: "Center", 
  crop: "150x150+0+0", 
  auto_orient: true  
)

これで警告が消え、画像の切り抜きもうまくいきました。

ただ、これがベストプラクティスかどうかは確信がないので、もっと良い解決策を知ってる人がいたらコメントお待ちしています!

追記:こんなやり方があった!

同僚の @aki77 が「こんなやり方がありますよー」と、もっと便利な書き方を教えてくれました。(どうもありがとう!)

確かもうちょっと簡単に書けるようになったはずと思って調べてみました。
多分↓で良さそう。

user.avatar.variant(resize_to_fill: [150, 150])
https://edgeguides.rubyonrails.org/active_storage_overview.html#transforming-images

carrierwaveでも同じだったなーと思ったら、あっちもimage_processing使ってるんですね。
https://github.com/carrierwaveuploader/carrierwave/blob/master/carrierwave.gemspec#L27

ということで、Rails 6ではこれだけでOKです!
auto_orient: trueもデフォルトでセットされます)

user.avatar.variant(resize_to_fill: [150, 150])

めっちゃシンプルになりましたね!やったー🙌

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away