Reputation: 763
I have this error trying to upload images to aws bucket.
no implicit conversion of nil into String
I am currently just using an uploading class and an initializer file.
initializers/carrierwave.rb
Carrierwave.configure do |config|
config.storage = :aws
config.aws_bucket = 'larfs'
config.aws_acl = :public_read
config.assets_host = ''
config.aws_authenticated_url_expiration = 60 * 6 * 24 * 365
config.aws_credentials = {
access_key_id: 132abc,
secret_access_key: 123abc
}
end
videouploader class, (used in this instance just for images)
class VideoUploader < CarrierWave::Uploader::Base
# Include RMagick or MiniMagick support:
# include CarrierWave::RMagick
include CarrierWave::MiniMagick
# Choose what kind of storage to use for this uploader:
storage :file
# storage :fog
storage :aws
# Override the directory where uploaded files will be stored.
# This is a sensible default for uploaders that are meant to be mounted:
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
# Provide a default URL as a default if there hasn't been a file uploaded:
# def default_url
# # For Rails 3.1+ asset pipeline compatibility:
# # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
#
# "/images/fallback/" + [version_name, "default.png"].compact.join('_')
# end
# Process files as they are uploaded:
# process :scale => [200, 300]
#
# def scale(width, height)
# process r
# end
# Create different versions of your uploaded files:
version :thumb do
# process :scale => [50, 50]
process :resize_to_fill => [90, 90]
end
version :index do
process :resize_to_fill => [200, 200]
end
version :medium do
# process :scale => [150, 170]
process :resize_to_fit => [200, 300]
end
# Add a white list of extensions which are allowed to be uploaded.
# For images you might use something like this:
def extension_white_list
%w(jpg jpeg gif png)
end
# Override the filename of the uploaded files:
# Avoid using model.id or version_name here, see uploader/store.rb for details.
# def filename
# "something.jpg" if original_filename
# end
end
Upvotes: 1
Views: 523
Reputation: 497
I spent a LOT of time trying to get carrierwave and fog to work together to upload images to AWS.
In the end, it was as simple as moving away from Fog and using the carrierwave-aws gem - https://github.com/sorentwo/carrierwave-aws
Documentation was pretty easy to follow.
Fog was way more than I needed for a simple image upload and carrierwave-aws just worked.
Lots of benefits to switch unless you're beholden to Fog for a specific need.
Upvotes: 1
Reputation: 2451
Add in the Gemfile
:-
gem 'carrierwave'
gem 'rmagick'
gem 'fog'
gem 'carrierwave_direct'
In initializers/carrierwave.rb
:-
CarrierWave.configure do |config|
config.fog_credentials = {
provider: "AWS",
aws_access_key_id: '132abc',
aws_secret_access_key: '123abc'
}
config.fog_directory = 'larfs'
end
In videouploader class
:-
class VideoUploader < CarrierWave::Uploader::Base
# Include RMagick or MiniMagick support:
# include CarrierWave::RMagick
include CarrierWave::MiniMagick
# Choose what kind of storage to use for this uploader:
#storage :file
storage :fog
#storage :aws
# Override the directory where uploaded files will be stored.
# This is a sensible default for uploaders that are meant to be mounted:
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
# Provide a default URL as a default if there hasn't been a file uploaded:
# def default_url
# # For Rails 3.1+ asset pipeline compatibility:
# # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
#
# "/images/fallback/" + [version_name, "default.png"].compact.join('_')
# end
# Process files as they are uploaded:
# process :scale => [200, 300]
#
# def scale(width, height)
# process r
# end
# Create different versions of your uploaded files:
version :thumb do
# process :scale => [50, 50]
process :resize_to_fill => [90, 90]
end
version :index do
process :resize_to_fill => [200, 200]
end
version :medium do
# process :scale => [150, 170]
process :resize_to_fit => [200, 300]
end
# Add a white list of extensions which are allowed to be uploaded.
# For images you might use something like this:
def extension_white_list
%w(jpg jpeg gif png)
end
# Override the filename of the uploaded files:
# Avoid using model.id or version_name here, see uploader/store.rb for details.
# def filename
# "something.jpg" if original_filename
# end
end
Upvotes: 1