起こった出来事
現在作成しているアプリで画像アップロード機能を実装しようと思い、fog-aws carrierwave を組み合わせてS3にアップロードしようと思ったところでかなりの時間を消費していましたが無事に解決できましたので、それまでの過程を備忘録として記入したいと思います。
そもそも何故ダメだったのか
```argumenterror ( is not a recognized provider):````というエラーが出ており、そもそもプロバイダー自体が読み込めていないと判断し
carriewave.rbとimage-uploder.rbでaws設定関連の記述ミスや環境変数がちゃんと適用されてるか、バケット名が間違えてないかなど思い当たるところは片っぱしから調べましたが全部あっており、完全にわからない状態でした。
carriewave.rb
require 'carrierwave/storage/abstract'
require 'carrierwave/storage/file'
require 'carrierwave/storage/fog'
CarrierWave.configure do |config|
case Rails.env
when 'development', 'test'
config.storage = :file
config.cache_storage = :file
else
config.fog_credentials = {
provider: 'AWS',
aws_access_key_id: Rails.application.credentials.aws[:access_key_id],
aws_secret_access_key: Rails.application.credentials.aws[:secret_access_key],
region: 'ap-northeast-1',
}
config.fog_provider = 'fog/aws'
config.storage :fog
config.cache_storage = :fog
config.fog_directory = 'バケット名'
config.fog_public = false
end
end
image-uploder.rb
class ImageUploader < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick
if Rails.env.production?
storage :fog
else
storage :file
end
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
def default_url(*_args)
'/images/' + [version_name, 'default.png'].compact.join('_')
end
version :thumb do
process resize_to_fit: [128, 128]
end
version :medium do
process resize_to_fit: [360, 360]
end
def extension_whitelist
%w[jpg jpeg gif png]
end
end
解決策
しかし見落としがありました、私が参考にしたサイトには記述されていませんでしたが
config.asset_host = "https://s3.ap-northeast-1.amazonaws.com/バケット名"
この記述をcarriewave.rbに書いているサイトがあり、まさかと思い試しに追記してみたらこれが動くんですよね。
carriewave.rb
require 'carrierwave/storage/abstract'
require 'carrierwave/storage/file'
require 'carrierwave/storage/fog'
CarrierWave.configure do |config|
case Rails.env
when 'development', 'test'
config.storage = :file
config.cache_storage = :file
else
config.fog_credentials = {
provider: 'AWS',
aws_access_key_id: Rails.application.credentials.aws[:access_key_id],
aws_secret_access_key: Rails.application.credentials.aws[:secret_access_key],
region: 'ap-northeast-1',
}
config.fog_provider = 'fog/aws'
config.storage :fog
config.cache_storage = :fog:
config.asset_host = "https://s3.ap-northeast-1.amazonaws.com/バケット名"
config.fog_directory = 'バケット名'
config.fog_public = false
end
end
以上です。