简体   繁体   English

轨道和载波

[英]Rails and carrierwave

I have this error trying to upload images to aws bucket. 我在尝试将图像上传到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.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) videouploader类,(在此实例中仅用于图像)

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

Add in the Gemfile :- Gemfile添加:-

gem 'carrierwave'
gem 'rmagick'
gem 'fog'
gem 'carrierwave_direct'

In initializers/carrierwave.rb :- 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 :- 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

I spent a LOT of time trying to get carrierwave and fog to work together to upload images to AWS. 我花了很多时间试图使载波和雾一起工作以将图像上传到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 最后,它是从雾移开并用carrierwave-AWS宝石一样简单- 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. 除非您因特定需要而迷雾,否则可以转换很多好处。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM