困っていたこと
Rails 5.2時代にActiveStorageでこんなコードを書いていました。
user.avatar.variant(
combine_options: {
resize: "150^",
gravity: "Center",
crop: "150x150+0+0",
auto_orient: true
}
)
やっていることは縦長だったり横長だったりする画像を、中心で正方形に切り抜いて150x150サイズに縮小することです。(mini_magickを使用)
このコードを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に追加します。
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])
めっちゃシンプルになりましたね!やったー🙌