#MiniMagickの使い方
ArgumentError wrong number of arguments (given 4, expected 2)
開発環境
ruby 2.7.0p0
Rails 5.2.4.1
はい、またしても出ましたArgumentError
minimagickというgemを導入したらエラーが出たので改善してみました。
なかでも『wrong number of arguments (given 4, expected 2)』についての解説です。
今回はポートフォリオにアップロードした画像のサイズを変えたり余白を設定するgemを実装した時に起きたエラーです。
今までのポートフォリオではインスタライクなサービスなのでとりあえず画像投稿機能までは作っていたのですが、画像のファイル制限はしているものの縦横サイズ感についての制限はしておらず、投稿によってはやけに縦長のトピックになってしまったりしていました。
そこでGemfile の MiniMagickを導入することにしました。
##MiniMagick とは画像リサイズしたり画像加工に使われるgem
こちらの記事を参考に導入してみました。
僕は一度つまづきましたがちゃんと上から読むと
ImageMagickを導入することが前提条件としてあります。気をつけましょう汗
$ brew install imagemagick
このコードでインストールします。意外と時間がかかるので注意です(5分程度)
アプリ制作途中でimagemagickをインストールしているかどうだったのかわからない方は以下コードで確認してください。
$ convert -version
これをうって
command not found
こちらが出ない場合は既にインストールされています。出たらインストールしましょう。
ImageMagickを導入後、MiniMagickをgemファイルに書きます。
gem ‘mini_magick’, ‘~> 4.8’
gemファイル上でコメントアウトされていることが多いと思うのでコメントを外し更新
$ bundle install
gemファイルをbundle installしたら一回rails cで止めて rails sで再起動します。
gemファイル導入できたらimage_uploader.rbに
include CarrierWave::MiniMagick
こんな感じで準備完了です
先ほどのqiitaの記事を見てimage_uploader.rbに以下記述
process resize_to_limit: [300, 200, “#ffffff”, “Center”]
このコードでwidth を最大 300px、height を最大 200 px
リサイズ後のファイルの余白部分を指定色でぬりつぶすこともできるらしい。
この場合、第三引数で塗りつぶしの色を指定(#ffffff)し、第四引数で余白が発生した際の画像の配置を指定(center)。
実際に記事の通りこちらのコードを書いて処理を実行すると
こちらのエラーが発生!!
前回の記事でも書いた通りArgumentErrorなので引数関係のエラーということがわかる 詳細を見ると
wrong number of arguments (given 4, expected 2)
早速検索するとこちらの記事が
https://qiita.com/TOSHIMITSU_MIYACHI/items/82417ab6126d816af4e4
つまり2つの引数を期待しているのに4つの引数がきているよ!! というエラー
先ほど書いたコードを見ると
process resize_to_limit: [300, 200, “#ffffff”, “Center”]
ここでの引数が4つになっているのでこれを
process resize_to_limit: [300, 200, “Center”]
指定色を消して再度更新すると
wrong number of arguments (given 3, expected 2)になりました。
つまり2つの引数を期待しているのに対し3つの引数になってるよというエラーです。
こうなるとprocess resize_to_limit: の書き方が間違っているのかなーと思い公式リファレンスを読んでみました。
https://github.com/carrierwaveuploader/carrierwave
そのままだと英語で難しいのでブラウザ機能で日本語化
どうやらresize_to_limit: 元々画像サイズの指定のみのようです
##resize_and_pad:
これが縦サイズ、横サイズ、残りの領域の指定色、画像位置の指定を設定することができる方法のようです。(4つの引数)
参考にさせていただいたqiitaの記事は1年前のものだったのでバージョンが変わり仕様が変わってしまったのかもしれません。
もしくは環境が違ったりしてエラーが出てしまったのかもしれません。
なので
#解決法
process :resize_and_pad => [500, 500, “#ffffff”, “Center”]
こちらのコードで書き直すことでエラーも出ず期待通りの結果を得られるようになりました。
同じ状況で苦しんでいる方の参考になれば