Rails
AWS
S3
carrierwave
fog

[Rails] Carrierwave で S3 にファイルをアップロードしようとしたときにハマった(ArgumentError: wrong number of arguments)

Rails5 で Carrierwave 使って S3 にファイルをアップロードしようとしたら、モデルを保存する際に決まったエラーが出てハマった。

> model = Model.new([画像やらなんやら])
> model.save
 => ArgumentError: wrong number of arguments (given 3, expected 1)

Carrierwaveの中身を見たりしたけどよくわからず、設定を見直すことに。

config/initializers/carrierwave.rb の設定は、ネットからパクったやつなんでちゃんと見てなかったけど、こんな行があった。

  config.cache_storage = :fog   

キャッシュも fog を通して S3 に上げますよ。っていう設定らしい。

ここで原因に気づきました。テストでファイルのアップロードを試していたのですが、テスト環境では S3 ではなくローカルに保存するよう設定を書いていた。。。

(app/uploader以下のuploaderクラスのファイル)

if Rails.env.development?
  storage :file
elsif Rails.env.test?
  storage :file
else
  storage :fog
end

結局、development と test 環境では ローカル にファイルを保存するって書いてんのに、キャッシュは fog で S3 にとるぜ、っていう設定になっているためでした。

対策としては、config/initializers/carrierwave.rb の設定を環境ごとにちゃんと分けるコト。(あたりまえのことかもしれませんが...)

if Rails.env.development?                                                                                                                   
  CarrierWave.configure do |config|
   # developmentのもろもろの設定
  end 
elsif Rails.env.test?
  CarrierWave.configure do |config|
    # testのもろもろの設定
  end 
else
  CarrierWave.configure do |config|
    # productionのもろもろの設定
    config.cache_storage = :fog # fogを使う環境だけに適用!
  end 
end

こっちに storage の設定も一緒に書いた方がいいかもしれないとも思った。

コピペで済ませようとしたせいで起きた初歩的なミスでした。