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 の設定も一緒に書いた方がいいかもしれないとも思った。
コピペで済ませようとしたせいで起きた初歩的なミスでした。