ArgumentError  wrong number of arguments (given 4, expected 2) MiniMagickの使い方

開発環境
ruby 2.7.0p0
Rails 5.2.4.1



はい、またしても出ましたArgumentError


なかでも『wrong number of arguments (given 4, expected 2)』についての解説です。



今回はポートフォリオにアップロードした画像のサイズを変えたり余白を設定するgemを実装した時に起きたエラーです。


今までのポートフォリオではインスタライクなサービスなのでとりあえず画像投稿機能までは作っていたのですが、画像のファイル制限はしているものの縦横サイズ感についての制限はしておらず、投稿によってはやけに縦長のトピックになってしまったりしていました。


そこでGemfile の MiniMagickを導入することにしました。

MiniMagick  とは画像リサイズしたり画像加工に使われるgemです


https://qiita.com/ryo-ichikawa/items/6fbb66b8ecfdd0f1f9c4

こちらの記事を参考に導入してみました。

僕は一度つまづきましたがちゃんと上から読むと
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:


これが縦サイズ、横サイズ、残りの領域の指定色、画像位置の指定を設定することができる方法のようです。

参考にさせていただいたqiitaの記事は1年前のものだったのでバージョンが変わり仕様が変わってしまったのかもしれません。


もしくは環境が違ったりしてエラーが出てしまったのかもしれません。

なので

process :resize_and_pad => [500, 500, “#ffffff”, “Center”]


こちらのコードで書き直すことでエラーも出ず期待通りの結果を得られるようになりました。



同じ状況で苦しんでいる方の参考になれば