Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
10
Help us understand the problem. What is going on with this article?
@jnchito

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

More than 1 year has passed since last update.

困っていたこと

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])

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

10
Help us understand the problem. What is going on with this article?
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
jnchito
株式会社ソニックガーデンのRubyプログラマ。 「プロを目指す人のためのRuby入門( https://bit.ly/3wmJheK )」の著者。 および「Everyday Rails - RSpecによるRailsテスト入門 ( https://bit.ly/3rKqrKX )」の翻訳者。 プログラミングスクール「フィヨルドブートキャンプ」のメンターでもある。
sonicgarden
「お客様に無駄遣いをさせない受託開発」と「習慣を変えるソフトウェアのサービス」に取り組んでいるソフトウェア企業

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
10
Help us understand the problem. What is going on with this article?