😎

`variant`メソッドを使ったが画像が表示されない現象に対処する! with Rails7, Active Storage

2022/06/27に公開

概要

RailsチュートリアルをRails 7で実装に挑戦。
そしてRailsチュートリアルでも登場してくるvariantメソッド。(第13章)
こちらを使って投稿した画像を表示しようとしたが、なぜか表示されない現象が発生。

qiita_error_pic.png

さてこの現象と向き合うことにしよう...

結論

解決するためには以下の2通りある。簡単だ。

1: vipsライブラリをインストールする

ターミナル
$ brew install vips

2: 明示的にmini_magickを指定する

config/application.rb
# ===== 省略 =====
module RailsTutorialApp
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 7.0
    # ===== 以下を追加 =====
    config.active_storage.variant_processor = :mini_magick

# ===== 省略 =====
  end
end

Why?

まず、前提として画像の加工にはImageMagickのインストールが必要だ。

ターミナル(Mac)
$ brew install imagemagick

インストールが完了したら次はGemが必要になる

Gemfile
gem "image_processing"
gem "mini_magick"

*Railsチュートリアルを進めている人は、指定のバージョンを明示的にするべきかもしれません。

ターミナル
$ bundle install

gem "image_processing"を導入することで冒頭のActive Storageが提供するvariantメソッドを使えるようになります。

...so you must add gem "image_processing" to your Gemfile if you wish to use variants.
引用:ActiveStorage::Variant < Object

ただし、Rails 7ではデフォルトでvipsライブラリが使われるようになっているみたいです。
*上記のRailsAPIドキュメントではMiniMagicとなってますが...

...and have config.load_defaults 7.0 set in config/application.rb, then your app will use vips by default.
引用:Could not open library 'vips.42'; Could not open library 'libvips.42.dylib'

というわけで、結論に戻ってくるわけだが

1: vipsライブラリをインストールする

ターミナル
$ brew install vips

2: 明示的にmini_magickを指定する

config/application.rb
# ===== 省略 =====
module RailsTutorialApp
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 7.0
    # ===== 以下を追加 =====
    config.active_storage.variant_processor = :mini_magick

# ===== 省略 =====
  end
end

結果...上手く行った!!!

qiita_correct_pic.png

おまけ

ちなみに私の場合、投稿直後のログはこのようになっていた。(一部抜粋)

ログ
# ==== 省略 =====
22:04:32 web.1  | LoadError (Could not open library 'vips.42': dlopen(vips.42, 0x0005): tried: 'vips.42' (no such file), '/usr/local/lib/vips.42' (no such file), '/usr/lib/vips.42' (no such file), '/Users/***/my_app/rails_tutorial_app/vips.42' (no such file).
22:04:32 web.1  | Could not open library 'libvips.42.dylib': dlopen(libvips.42.dylib, 0x0005): tried: 'libvips.42.dylib' (no such file), '/usr/local/lib/libvips.42.dylib' (no such file), '/usr/lib/libvips.42.dylib' (no such file), '/Users/***/my_app/rails_tutorial_app/libvips.42.dylib' (no such file)):

やはり、デフォルトではvipsライブラリを使用しているみたいだ。

Discussion