Spencer Hire
Spencer Hire

Reputation: 763

Rails and carrierwave

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

Answers (2)

jakeatwork
jakeatwork

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

Shamsul Haque
Shamsul Haque

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

Related Questions